我正在尝试使用python的re模块来匹配字符串,其中模式可能重复或不重复。该字符串以由:
分隔的三个字母部分开头,然后有一个=
跟随另一个字母部分。字符串可以在此处完成或继续重复用逗号分隔的alphabetical_part=alphabetical_part
模式。两个样本如下:
Finishes with just one repeat ==> aa:bb:cc=dd
Finishes with more than one repeat ==> aa:bb:cc=dd,ee=ff,gg=hh
如您所见,字符串末尾不能有逗号。我写了一个匹配的模式:
>>> pt = re.compile(r'\S+:\S+:[\S+=\S+$|,]+')
re.match
为此返回一个匹配对象,但是当我对重复模式进行分组时,我得到了一些奇怪的内容,请参阅:
>>> st = 'xx:zz:rr=uu,ii=oo,ff=ee'
>>> pt = re.compile(r'\S+:\S+:([\S+=\S+$|,]+)')
>>> pt.findall(st)
['e']
我不确定我是否写了正确的模式;我怎么检查呢?如果这是错的,那么正确答案是什么?
答案 0 :(得分:1)
我想你想要这样的东西,
>>> import re
>>> s = """ foo bar bar foo
xx:zz:rr=uu,ii=oo,ff=ee
aa:bb:cc=dd
xx:zz:rr=uu,ii=oo,ff=ee
bar foo"""
>>> m = re.findall(r'^[^=: ]+?[=:](?:[^=:,]+?[:=][^,\n]+?)(?:,[^=:,]+?[=:][^,\n]+?)*$', s, re.M)
>>> m
['xx:zz:rr=uu,ii=oo,ff=ee', 'aa:bb:cc=dd', 'xx:zz:rr=uu,ii=oo,ff=ee']
答案 1 :(得分:1)
st = 'xx:zz:rr=uu,ii=oo,ff=ee'
m = re.findall(r'\w+:\w+:(\w+=\w+)((?:,\w+=\w+)*)', st )
>>> m
[('rr=uu', ',ii=oo,ff=ee')]
请勿使用\S
,因为这也会匹配:
。最好使用\w
或者:
re.findall(r'\w+:\w+:(\w+=\w+(?:,\w+=\w+)*)', st )[0].split(',')
# This will return: ['rr=uu', 'ii=oo', 'ff=ee']
答案 2 :(得分:0)
这是一个更易读的正则表达式,适合您:
\S+?:\S+?:(?:\S+?=\S+?.)+
它使用非捕获组(?:...)
和加号+
重复令牌来匹配一个或多个“ alphabetical_part=alphabetical_part
”< / p>
示例:
>>> import re
>>> str = """ foo bar
... foo bar bar foo
... xx:zz:rr=uu,ii=oo,ff=ee
... aa:bb:cc=dd
... xx:zz:rr=uu,ii=oo,ff=ee
... bar foo """
>>> pat = re.compile(ur'\S+?:\S+?:(?:\S+?=\S+?.)+')
>>> re.findall(pat, str)
['xx:zz:rr=uu,ii=oo,ff=ee', 'aa:bb:cc=dd', 'xx:zz:rr=uu,ii=oo,ff=ee']