使用正则表达式按照特定模式提取多个字符串

问题描述

我有一个像这样的长字符串,我想提取 Invalid items 之后的所有项目,所以我希望正则表达式返回一个列表 ['abc.def.com','bar123','hello','world','1212','5566','aaaa']

我尝试使用这种模式,但它给我每场比赛一组

import re
test = 'Valid items: (aaa.com; bbb.com); Invalid items: (abc.def.com;); Valid items: (foo123;); Invalid items: (bar123;); Valid items: (1234; 5678; abcd;); Invalid items: (hello; world; 1212; 5566; aaaa;)'
re.findall(r'Invalid items: \((.+?);\)',test)
# ['abc.def.com','hello; world; 1212; 5566; aaaa']

使用正则表达式有更好的方法吗?

谢谢

解决方法

如果您只想使用单个 findall 单独返回所有匹配项,那么您需要使用正向后视,例如(?<=foo)。不幸的是,Python 模块 re 仅支持固定宽度的后视。但是,如果您愿意使用出色的 regex 模块,那么就可以做到。

正则表达式:

(?<=Invalid items: \([^)]*)[^ ;)]+

演示: https://regex101.com/r/p90Z81/1

如果可以有空项目,对正则表达式的小修改允许捕获这些零宽度匹配,如下所示:

(?<=Invalid items: \([^)]*)(?:[^ ;)]+|(?<=\(| ))
,

使用 re,您可以用分号和空格分割匹配的组

import re
test = 'Valid items: (aaa.com; bbb.com); Invalid items: (abc.def.com;); Valid items: (foo123;); Invalid items: (bar123;); Valid items: (1234; 5678; abcd;); Invalid items: (hello; world; 1212; 5566; aaaa;)'
results = []
for s in re.findall(r'Invalid items: \((.+?);\)',test):
     results = results + s.split(r"; ")

print(results)

输出

['abc.def.com','bar123','hello','world','1212','5566','aaaa']

看到一个 Python demo