2017-05-29 123 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