这是我的输入文件
input.txt中
www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NM_003157.1 rs 1123
www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NM_006157 dd 12
www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NM_021018.2 ff 121
www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NM_000908.2 rs10472828-?
预期输出
NM_003157.1
NM_006157
NP_021018.2
NM_000908.2
我的正则表达式
egrep "N[A-Z]_[0-9]{1,}(\.[1-9])*" input.txt
我的代码
f=open("input.txt")
for i in f:
print(re.findall("N[A-Z]_[0-9]{1,}(\.[1-9])*",i.strip()))`
python输出:
[]
[]
['.3']
[]
我的grep输出与我预期的输出完全匹配。但是当我在我的python3代码中使用相同的正则表达式时,我得到了不正确的输出。
答案 0 :(得分:3)
您的Python模式中还有一个.
太多egrep
版本缺少;删除它。
接下来,re.findall()
返回捕获群组,而不是整个匹配,如果有这样的群组。使用(?:...)
代替(...)
re.findall(r'N[A-Z]_[0-9]+(?:\.[1-9])*', i.strip())
现在re.findall()
生成一个列表,每行一个匹配:
>>> import re
>>> text = '''\
... www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NM_003157.1 rs 1123
... www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NM_006157 dd 12
... www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NM_021018.2 ff 121
... www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NM_000908.2 rs10472828-?
... '''
>>> f = text.splitlines()
>>> for i in f:
... print(re.findall(r"N[A-Z]_[0-9]+(?:\.[1-9])*", i.strip()))
...
['NM_003157.1']
['NM_006157']
['NM_021018.2']
['NM_000908.2']
每行只需一个匹配,您最好使用re.search()
,然后在结果上调用MatchObject.group()
:
>>> for i in f:
... print(re.search(r"N[A-Z]_[0-9]+(?:\.[1-9])*", i.strip()).group())
...
NM_003157.1
NM_006157
NM_021018.2
NM_000908.2
答案 1 :(得分:1)
通过带有oP
参数的grep,
$ grep -oP '(?<=;val=)\S*(?=\s)' file
NM_003157.1
NM_006157
NM_021018.2
NM_000908.2
lookbehind用于查找字符串;val=
并匹配所有非空格字符后跟空格字符。
通过egrep,
$ egrep -o "N[A-Z]_[0-9]{1,}(\.[1-9])*" file
NM_003157.1
NM_006157
NM_021018.2
NM_000908.2
在egrep
中,您错过了-o
参数,该参数告诉egrep
仅打印匹配的字符串。