python正则表达式匹配全部
问题描述:
我正在尝试做一个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')]
谢谢。
答
你就近了。只是让你的对手贪心不足:
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 ^
谢谢!完美的作品。如果我知道如何,我会将其标记为正确。 –
我回去学习了一下。作为一个便笺,我想指出我认为我为其他具有普通正则表达式技能的人出错的地方。这里是“[。\ s \ S]”。我相信 ”。”是问题的重要组成部分,因为它以贪婪的方式将所有内容匹配到最后(Z [A-Z0-9] +)。再次感谢Dawg。 –
部分'[\ s \ S]'匹配任何字符,包括'\ n'。它将在下一场比赛中正确运行。除非你想一直运行到最后,否则很少使用“?”。 – dawg