Regex:获取重复命名组的所有子字符串

2024-10-01 15:31:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用命名组从重复模式中检索匹配项。 我的代码如下所示:

import re

pattern = '(?P<single1>[\w]+?)_((?P<multiple>[\w]+?)_)+(?P<single2>[\w]+?)'
example = '000_010_020_030_040'
m = re.match(pattern, example)
print(m.group('multiple'))

这将打印030,因为先前的匹配被丢弃。我需要的是一个方法来得到所有匹配的列表。例如:['010', '020', '030']

regex模块似乎提供了这个特性。但是我需要一个没有外部依赖的解决方案

编辑

模式由用户输入生成。分隔字符以前是未知的。重复模式的位置和非重复模式的数量都不是问题。你知道吗

编辑2

以下是如何在regex模块中实现解决方案:

import regex
pattern = '(?P<single1>[\w]+?)_((?P<multiple>[\w]+?)_)+(?P<single2>[\w]+?)'
m = regex.match(pattern, example)
print(m.captures('multiple'))

返回['010', '020', '030']


Tags: 模块importre编辑examplematch模式解决方案
2条回答

尝试使用findall:

re.findall( pattern , example )

为了证明-我简化了你的模式。以下代码:

pattern = '\d\d\d'
example = '000_010_020_030_040'
re.findall(pattern, example)

返回所有匹配项的列表:

['000', '010', '020', '030', '040']

我认为你需要重叠的图案。Standart re模块不能用于普通regexp。但您可以使用forward search regexp进行模拟:

re.findall("(?=" + pattern + ")",example)

返回元组数组:

[('000', '030_', '030', '0'), ('00', '030_', '030', '0'), 

('0','030','030','0'),('010','030','030','030','0'),('010','030','030','0'),('10','030','030','030','0'),('0','030','030','0'),('020','030','030','0'),('20','030','030','0'),('0','030','030','0')]

或者

re.fintditer("(?=" + pattern + ")",example)

返回具有重叠的匹配对象的迭代器。你知道吗

另一个选项是tu useregex模块它有重叠选项

regex.findall(pattern, example, overlapped=True)

相关问题 更多 >

    热门问题