您可能不需要为此目的使用正则表达式,但在您的用例中它更快 =)
假设输入是文本,这是可行的
import re
text = "These are SOME words and someTHAT shouldNot match"
result = re.findall(r'\b[A-Z]+\b', text)
使用https://docs.python.org/3/library/stdtypes.html#str.isupper,这也可以:
text = "These are SOME words and someTHAT shouldNot match"
result = [word for word in text.split() if word.isupper()]
假设GNICorpus
来自https://www.ncbi.nlm.nih.gov/pubmed/30309207,很可能来自https://github.com/Ewha-Bio/Genomics-Informatics-Corpus
from nltk.corpus import PlaintextCorpusReader
root_dir = 'Genomics-Informatics-Corpus/GNI Corpus 1.0'
GNICorpus = PlaintextCorpusReader(root_dir, '.*\.txt', encoding='utf-8')
GNICorpus 对象有一个.raw() 函数,它将连接对象中的所有文件并返回一个str。
>>> type(GNICorpus.raw())
str
在这种情况下,正则表达式可以应用于原始字符串,例如
re.findall(r'\b[A-Z]+\b', GNICorpus.raw())
并且要使用str.isupper 函数而不是正则表达式,可以使用.words() 函数遍历语料库对象中的每个标记,即
[word for word in GNICorpus.words() if word.isupper()]
您会发现正则表达式比遍历.words() 快得多。如果您有兴趣,在线上有很多正则表达式与 Python 的本机字符串讨论。
但是等等!如果我们能用这种方法找到“基因序列”呢?
我们可以指定[ATCG]序列,而不是[A-Z]:
from collections import Counter
Counter(re.findall(r'\b[ATCG]+\b', GNICorpus.raw()))
[出]:
Counter({'G': 1249,
'CA': 958,
'A': 6558,
'CCCTC': 21,
'C': 2981,
'T': 1284,
'CTCT': 3,
'AG': 64,
'AACC': 3,
'AA': 28,
'CC': 131,
'TCGA': 122,
'GT': 427,
'GAGGGAGGGAGCGAGA': 3,
'GC': 122,
'GA': 102,
'TGACGTCA': 3,
'TCA': 15,
'GCG': 4,
'AGG': 12,
'ACA': 3,
'GCA': 3,
'GTG': 3,
'AGT': 6,
'GAA': 3,
'GAC': 18,
'AGA': 6,
'ACC': 7,
'CTT': 11,
'TGC': 12,
'AGC': 3,
'TCC': 7,
'TTC': 6,
'GTT': 4,
'ACG': 12,
'ATG': 4,
'GAG': 9,
'GGG': 3,
'AAT': 3,
'ACAGC': 3,
'AT': 35,
'TG': 270,
'GGTCAACAAATCATAAAGATATTGG': 3,
'TAAACTTCAGGGTGACCAAAAAATCA': 3,
'TA': 17,
'CT': 61,
'CGC': 20,
'TC': 100,
'GG': 23,
'CG': 15,
'AC': 6,
'CCCTCT': 4,
'TT': 124,
'CAGT': 3,
'TCTG': 3,
'ATCC': 61,
'AAAAACAACAAGATAA': 3,
'GATA': 6,
'CACCC': 3,
'ATC': 275,
'GGCGCCATCTT': 3,
'TCTGAGCC': 3,
'CGCC': 3,
'GCTA': 7,
'AAA': 2,
'AAG': 30,
'GTA': 4,
'ATT': 4,
'AAC': 4,
'CAT': 8,
'GGC': 6,
'TAA': 6,
'TTT': 9,
'CAG': 3,
'TGG': 3,
'CCT': 11,
'CTC': 273,
'CCG': 12,
'GCT': 271,
'TAG': 3,
'TAT': 7,
'CAC': 6,
'TAC': 8,
'TCG': 3,
'TTG': 6,
'ATA': 21,
'TTAGGG': 3,
'CACTA': 3,
'TATA': 19,
'CCA': 31,
'CCC': 4,
'CGT': 3,
'CGA': 3,
'CGG': 3,
'GTC': 268,
'GGCAGG': 246,
'CGTGCCCCAGCCCAGTC': 1,
'TTCCAGTACAGCCCATCCAATAAG': 1,
'TGCGAGGGCTGCGAGGTC': 1,
'TGTCAGCTTGCGTGTGGTTGC': 1,
'GTAACCCGTTGCACCCCATT': 1,
'CCATCCAATCGGTAGTAGCG': 1,
'GACGATGCTCCCCGGGCTGTATTC': 1,
'TCTCTTGCTCTGGGCCTCGTCACC': 1,
'TCTTAACTGCCGGATCCACAAAAA': 1,
'ATCTCCGCCAACAGCTTCTCCTTC': 1,
'GGGCAGCCTCCGTTTGATGGT': 1,
'CGCTTGGCAGGGTGTTTGGTC': 1,
'GCCATCGAGGAGTGCCAATACC': 1,
'GGCCACACCTGCTGAAGAGATG': 1,
'GTAGCCCCAGTGGAGAGCCTTGTG': 1,
'ATGCCAGTGGGGAGTTTGTTATCG': 1,
'TGAATCGGACCCACTTGAGAGG': 1,
'CAGGAGCGGCTTGTTTGAGGTA': 1,
'GGAGGCGCCGAGACTTAGGT': 1,
'GCGGGTGAGCACAGCAGAGC': 1,
'TCATCCCGAATAAAAGCGAAGAGC': 1,
'AGGGCAACAACATTAGCAGGAGAT': 1,
'GATGTGATCCGACATTACA': 1,
'CTAGAACTGCTCTGTATGT': 1,
'CAATTCGGCAAGTAATGGA': 1,
'GTCTCTTCGGGAACTGCAAG': 1,
'TGGGACACAGGCACTGTAGA': 1,
'GCTCTCTGCTCCTCCTGTTC': 1,
'CAATACGACCAAATCCGTTG': 1,
'ATCG': 10,
'TCGT': 2,
'TGAT': 1,
'CGTG': 1,
'CGTT': 1,
'CATC': 1,
'GTGA': 1,
'ATCGT': 4,
'TCGTG': 1,
'TCGTT': 1,
'CGTGA': 1,
'CATCG': 1,
'GTGAT': 1,
'CGTGAT': 1,
'CATCGT': 1,
'TCGTGA': 1,
'TCGTGAT': 1,
'ATCGTGACT': 1,
'CGTGATT': 2,
'GTGACT': 1,
'ATCGTT': 1,
'ATCGTGAGA': 1,
'GTGAAG': 1,
'GTGATTG': 1,
'GTGATT': 1,
'TCGTGACT': 3,
'TCGATTG': 3,
'TCGTGAGA': 3,
'TTACT': 3,
'ACT': 5,
'ATTG': 2,
'GATTG': 1,
'TGTGTAGAGCTCCTCG': 1,
'TTAAA': 1,
'GGCG': 1,
'TACCTGCATGCTGCGGTGAAG': 1,
'AGGGCTGTGTAGAAGTACTCGC': 1,
'TTTT': 2,
'AATAAA': 1,
'TCGTGCA': 1,
'TCTACCTCGACAG': 1,
'CCTCCTCCT': 1,
'CCTTGGTTTTC': 1,
'GAAATCCCATCACCATCTTCCAGG': 1,
'GAGCCCCAGCCTTCTCCATG': 1,
'AACACCA': 1,
'CGCTCCCGCCTTACTTCGCA': 1,
'TTAGCTTGCCTCGTCCCC': 1,
'TTTCGACACTGGATGGCG': 1,
'TTGCGTTGCGTAGGGGGGAT': 1,
'TTTAAA': 2,
'GATATC': 1,
'AGTATC': 1,
'CGTCTGTGAGGGGAGCGTTT': 1,
'TGATTTTGATGACGAGCGTAAT': 1,
'GATGTGAGAACTGTATCCTAGCAAG': 1,
'GGCTGGCCTGTTGAACAAGTCTGGA': 1,
'ATAC': 1,
'GTCGGAGTCAACGGATTTG': 1,
'TGGGTGGAATCA': 1,
'TATTGGA': 1,
'AGAAAAAGCAACCACGAAGC': 1,
'AAACCTCTGTCTGTGAGTGCC': 1,
'TATT': 1,
'ACCC': 1,
'GCCA': 15,
'CAAT': 1,
'AGAC': 11,
'GCTCCCGCCTTACTTCGCAT': 1,
'CGGGGACGAGGCAAGCTAA': 1,
'GCCGCCATCCAGTGTCG': 1,
'TTGCGTTGCGTAGGGGGG': 1})
如果我想设置最小数量怎么办?字符序列?
如果我们想将最小字符设置为4,而不是+,可以使用{4,}:
from collections import Counter
Counter(re.findall(r'\b[ATCG]{4,}\b', GNICorpus.raw()))