我正在尝试匹配重复的模式(ip成员),但是仅在出现特定字符串之后才匹配。我可以先拆分并在第二部分上运行正则表达式来执行此操作,但我想知道是否可以使用单个正则表达式来执行此操作。例子是
import re
s4 = """
ddddddhhhhhhf jjjjjj 111.222.33.444 dddddd ddddddddddd
ccccccccccc
xxxxxxxxxx xxxxxxxxxj kkkkkk kkkkkk xxxxx111.222.888.444yyyy
xxxxxxxxxx xxxxxxxxxj kkkkkk kkkkkk xxxxx111.555.888.444yyyy
dddddd jjjjjjj 333.222.33.444 111.222.33.444 jjjjjjjjjjjj
"""
我想匹配ccccc之后的所有IP地址。如果我愿意
regex = "cccccc.*?(\d+\.\d+\.\d+\.\d+)+"
res = re.findall(regex, s4, re.DOTALL)
我只有111.222.888.444。如果我使用
regex = "(\d+\.\d+\.\d+\.\d+)+"
我会得到所有我不需要的IP地址。要使这项工作有效,必须使用哪种正则表达式语法?
谢谢
答案 0 :(得分:4)
您可以使用基于交替策略的正则表达式来匹配和丢弃文本,直到在LHS上首次匹配,并在捕获组中保持RHS上匹配的正则表达式:
(?s)^.*?c{11}|(\d+\.\d+\.\d+\.\d+)
代码:
>>> print (filter(None, re.findall(r'^(?s).*?c{11}|(\d+\.\d+\.\d+\.\d+)', s4)))
['111.222.888.444', '111.555.888.444', '333.222.33.444', '111.222.33.444']
filter
用于丢弃输出中的空匹配项。