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

时间:2014-07-11 11:31:46

标签: python regex

我有一个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:

test = re.search(r"^/(.+/),$", sequence_list[0])
print(test)

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

3 个答案:

答案 0 :(得分:0)

你需要转义括号:

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

答案 1 :(得分:0)

没有任何捕获组,

>>> 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

<强>解释

  • (?<=\()在正则表达式中,(?<=pattern)被称为lookbehind。它实际上是一个匹配lookbehind内部模式的字符串。在我们的例子中,lookbehind内部的模式是\(表示文字(
  • .*?(?=\),)它匹配任何字符零次或多次。 ?使得比赛不情愿之后的*。所以它做的最短。并且正则表达式引擎要匹配的字符必须后跟),

答案 2 :(得分:0)

  

有人能指出这个正则表达式中的错误吗? r"^/(.+/),$"

  1. 正则表达式转义character\而不是/(不要与也是\的python转义字符混淆,但在使用原始字符串时不需要) =&GT; r"^\(.+\),$"

  2. ^$匹配输入字符串的开头/结尾,而不是您要输出的内容 =&GT; r"\(.+\),"

  3. 您需要将“任意”字符匹配至)的第一个,而不是最后一个,因此您需要lazy operator +?
    =&GT; r"\(.+?\),"

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