grep输出与" re.findall()"不一样python3中的输出

时间:2014-07-07 13:46:10

标签: python regex unix grep

这是我的输入文件

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代码中使用相同的正则表达式时,我得到了不正确的输出。

2 个答案:

答案 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仅打印匹配的字符串。