正则表达式中的重复模式

时间:2016-05-20 19:41:57

标签: python regex

我想在我的字符串中捕捉重复的模式。子模式以单词的开头或":"开头,以":"或单词结尾开头。我尝试了findallsearch多个匹配((subpattern)__(subpattern))+的组合,但无法出错:

cc = "GT__abc23_1231:TF__XYZ451"

import regex
ma = regex.match("(\b|\:)([a-zA-Z]*)__(.*)(:|\b)", cc)

预期产出:

GT, abc23_1231, TF, XYZ451

我看到了许多像this这样的问题,但它没有帮助。

2 个答案:

答案 0 :(得分:2)

似乎你可以使用

(?:[^_:]|(?<!_)_(?!_))+

请参阅regex demo

模式详情

  • (?:[^_:]|(?<!_)_(?!_))+ - 1个或多个序列:
    • [^_:] - 除_:
    • 之外的任何字符
    • (?<!_)_(?!_) - 单个_未附加其他_ s

Python demo with re based solution

import re
p = re.compile(r'(?:[^_:]|(?<!_)_(?!_))+')
s = "GT__abc23_1231:TF__XYZ451"
print(p.findall(s))
# => ['GT', 'abc23_1231', 'TF', 'XYZ451']

如果第一个字符始终不是:_,您可以使用an unrolled regex,如:

r'[^_:]+(?:_(?!_)[^_:]*)*'

它不会匹配以单_开头的值(因此,展开的正则表达式更安全)。

答案 1 :(得分:2)

使用中的最小公分母“以:或字边界”开头和结尾,即字边界(您的子字符串由字组成)字符)

>>> import re
>>> cc = "GT__abc23_1231:TF__XYZ451"
>>> re.findall(r'\b([A-Za-z]+)__(\w+)', cc)
[['GT', 'abc23_1231'], ['TF', 'XYZ451']]

测试周围是否有:是没用的 (注意:不需要在\b之后添加\w+,因为量词是贪婪的,字边界变得隐含。)

[编辑]

根据你的评论:“我想首先拆分”:“然后拆分为双下划线。”,也许你根本不需要正则表达式:

>>> [x.split('__') for x in cc.split(':')]
[['GT', 'abc23_1231'], ['TF', 'XYZ451']]