正则表达式:获取重复命名组的所有子字符串

时间:2016-05-10 13:04:04

标签: python regex

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

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模块似乎提供此功能。但是,我需要一个没有外部依赖的解决方案

修改

模式由用户输入生成。之前不知道分隔字符。也不是重复图案的放置或非重复图案的数量。

EDIT2

以下是如何在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']

2 个答案:

答案 0 :(得分:0)

尝试使用findall:

re.findall( pattern , example )

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

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

返回所有匹配项的列表:

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

答案 1 :(得分:0)

我认为你需要重叠的模式。标准模块不能用于正常的正则表达式。但您可以使用正向搜索regexp来模拟它:

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

返回元组数组:

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

(&#39; 0&#39;,&#39; 030 _&#39;,&#39; 030&#39;,&#39; 0&#39;),(&#39; 010& #39;,&#39; 030 &#39;,&#39; 030&#39;,&#39; 0&#39;),(&#39; 010&#39;,&#39; ; 030 _&#39;,&#39; 030&#39;,&#39; 0&#39;),(&#39; 10&#39;,&#39; 030 _&#39;,&#39; 030&# 39;,&#39; 0&#39;),(&#39; 0&#39;,&#39; 030 _&#39;,&#39; 030&#39;,&#39; 0&#39;) ,&#39; 020&#39;,&#39; 030 &#39;,&#39; 030&#39;,&#39; 0&#39;),(&# 39; 020&#39;,&#39; 030 _&#39;,&#39; 030&#39;,&#39; 0&#39;),(&#39; 20&#39;,&#39; 030_& #39;,&#39; 030&#39;,&#39; 0&#39;),(&#39; 0&#39;,&#39; 030 _&#39;,&#39; 030&#39; ,&#39; 0&#39;)]

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

返回重叠的匹配对象的迭代器。

另一个选项是tu use regex模块,它有重叠选项

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