我想在我的字符串中捕捉重复的模式。子模式以单词的开头或":"
开头,以":"
或单词结尾开头。我尝试了findall
和search
多个匹配((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这样的问题,但它没有帮助。
答案 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']]