2017-05-29 124 views
1

我正在尝试做一个4行多行匹配。我的代码找到第一个。但不是其他人。python正则表达式匹配全部

这里是图案:

pattern = re.compile("([a-z]+\.com\.|net\.)[.\s\S]+(Z[A-Z0-9]+)") 

这里是受试者:

sub = """yahoo.com. 
Public 
8 
Z2RVE9XGX4PFJN 
google.com. 
Public 
7 
Z2VATLWTLBDR5D 
""" 

下面是完整的代码:

import re 
pattern = re.compile("([a-z]+\.com\.|net\.)[.\s\S]+(Z[A-Z0-9]+)") 

sub = """yahoo.com. 
Public 
8 
Z2RVE9JJGX4PFJN 
google.com. 
Public 
7 
Z2VATZOPLBDR5D 
""" 

m = pattern.findall(sub) 

print(m) 

下面是结果:

[('yahoo.com.', 'Z2RVE9JJGX4PFJN')] 

最后,这里是理想的结果:

[('yahoo.com.', 'Z2RVE9JJGX4PFJN'), ('google.com', Z2VATZOPLBDR5D')] 

谢谢。

回答

0

你就近了。只是让你的对手贪心不足:

import re 
pattern = re.compile("([a-z]+\.com\.|net\.)[\s\S]+?(Z[A-Z0-9]+)") 
# Note the 'less greedy' addition    ^
# The '.' is not necessary in the   ^in the character class 
sub = """yahoo.com. 
Public 
8 
Z2RVE9JJGX4PFJN 
google.com. 
Public 
7 
Z2VATZOPLBDR5D 
""" 

m = pattern.findall(sub) 

print(m) 

打印:

[('yahoo.com.', 'Z2RVE9JJGX4PFJN'), ('google.com.', 'Z2VATZOPLBDR5D')] 

有关你的模式的两端更加具体,你可能需要使用锚:

pattern = re.compile("^([a-z]+\.com\.|net\.)$[\s\S]+?^(Z[A-Z0-9]+)$", re.M) 
# Start of line  ^       ^
# End of line        ^     ^
# Multi line flag              ^
+0

谢谢!完美的作品。如果我知道如何,我会将其标记为正确。 –

+0

我回去学习了一下。作为一个便笺,我想指出我认为我为其他具有普通正则表达式技能的人出错的地方。这里是“[。\ s \ S]”。我相信 ”。”是问题的重要组成部分,因为它以贪婪的方式将所有内容匹配到最后(Z [A-Z0-9] +)。再次感谢Dawg。 –

+0

部分'[\ s \ S]'匹配任何字符,包括'\ n'。它将在下一场比赛中正确运行。除非你想一直运行到最后,否则很少使用“?”。 – dawg