Python中匹配圆括号的正则表达式

2024-10-01 13:32:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个fasta序列的列表,每个序列都是这样的:

>>> sequence_list[0]
'gi|13195623|ref|NM_024197.1| Mus musculus NADH dehydrogenase (ubiquinone) 1 alp
ha subcomplex 10 (Ndufa10), mRNAGCCGGCGCAGACGGCGAAGTCATGGCCTTGAGGTTGCTGAGACTCGTC
CCGGCGTCGGCTCCCGCGCGCGGCCTCGCGGCCGGAGCCCAGCGCGTGGG (etc)

我希望能够从我列表中的每个fasta条目中提取基因名,但是我很难找到正确的正则表达式。我以为这个可以用:“^/(.+/),$”。以圆括号开头,然后是任意数量的任意字符,然后以圆括号结尾,后跟逗号。不幸的是:这将返回None:

^{pr2}$

有人能指出这个正则表达式中的错误吗?在


Tags: ref列表序列listfastasequencenmmus
3条回答

Can someone point out the error in this regex? r"^/(.+/),$"

  1. regex转义character\不是{}(不要与python转义字符混淆,后者也是\,但在使用原始字符串时不需要)
    =>;r"^\(.+\),$"

  2. ^$匹配输入字符串的开始/结束,而不是要输出的内容
    =>;r"\(.+\),"

  3. 您需要将“any”字符匹配到第1个出现的),而不是最后一个,因此需要lazy operator+?
    =>;r"\(.+?\),"

  4. 如果基因名不能包含)字符,可以使用一个更快的正则表达式来避免backtracking
    =>;r"\([^)]+\),"

没有任何捕获组

>>> import re
>>> str = """
... gi|13195623|ref|NM_024197.1| Mus musculus NADH dehydrogenase (ubiquinone) 1 alp
... ha subcomplex 10 (Ndufa10), mRNAGCCGGCGCAGACGGCGAAGTCATGGCCTTGAGGTTGCTGAGACTCGTC
... CCGGCGTCGGCTCCCGCGCGCGGCCTCGCGGCCGGAGCCCAGCGCGTGGG (etc)"""
>>> m = re.findall(r'(?<=\().*?(?=\),)', str)
>>> m
['Ndufa10']

它只匹配括号内的单词,只有当右括号后面跟逗号时。在

DEMO

说明:

  • ^在regex (?<=pattern)中,{}被称为lookbehind。它实际上负责查找与lookbehind中的模式匹配的字符串。在我们的例子中,lookbehind中的模式是\(表示一个文本{}。在
  • .*?(?=\),)它匹配任何字符零次或多次。?后面的*使匹配变得不情愿。所以它做了一个最短的匹配。正则表达式引擎要匹配的字符后面必须跟),

您需要转义括号:

>>> re.findall(r'\([^)]*\),', txt)
['(Ndufa10),']

相关问题 更多 >