匹配特定字符串后的重复模式

时间:2018-09-17 17:48:38

标签: python regex

我正在尝试匹配重复的模式(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地址。要使这项工作有效,必须使用哪种正则表达式语法?

谢谢

1 个答案:

答案 0 :(得分:4)

您可以使用基于交替策略的正则表达式来匹配和丢弃文本,直到在LHS上首次匹配,并在捕获组中保持RHS上匹配的正则表达式:

(?s)^.*?c{11}|(\d+\.\d+\.\d+\.\d+)

RegEx Demo

代码:

>>> 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']

Code Demo

filter用于丢弃输出中的空匹配项。