首页 > 解决方案 > 在特定字符串之后匹配重复模式

问题描述

我试图匹配一个重复的模式(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 号码。使这项工作需要哪种正则表达式语法?

谢谢,

标签: pythonregex

解决方案


您可以基于交替策略使用此正则表达式来匹配和丢弃文本,直到 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用于从输出中丢弃空匹配。


推荐阅读