我有一个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)
有人能指出这个正则表达式中的错误吗?
答案 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']
仅当右括号后面跟一个逗号时,它才匹配括号内的单词。
<强>解释强>
(?<=\()
在正则表达式中,(?<=pattern)
被称为lookbehind。它实际上是一个匹配lookbehind内部模式的字符串。在我们的例子中,lookbehind内部的模式是\(
表示文字(
。.*?(?=\),)
它匹配任何字符零次或多次。 ?
使得比赛不情愿之后的*
。所以它做的最短。并且正则表达式引擎要匹配的字符必须后跟),
答案 2 :(得分:0)
有人能指出这个正则表达式中的错误吗?
r"^/(.+/),$"
正则表达式转义character是\
而不是/
(不要与也是\
的python转义字符混淆,但在使用原始字符串时不需要)
=&GT; r"^\(.+\),$"
^
和$
匹配输入字符串的开头/结尾,而不是您要输出的内容
=&GT; r"\(.+\),"
您需要将“任意”字符匹配至)
的第一个,而不是最后一个,因此您需要lazy operator +?
=&GT; r"\(.+?\),"
如果基因名称不能包含)
字符,您可以使用更快的正则表达式来避免backtracking
=&GT; r"\([^)]+\),"