我尝试使用命名组从重复模式中检索匹配项。 我的代码如下所示:
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']
答案 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)