如何使用python的re模块检测字符串中的重复模式

时间:2014-08-06 12:34:57

标签: python regex string

我正在尝试使用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']

我不确定我是否写了正确的模式;我怎么检查呢?如果这是错的,那么正确答案是什么?

3 个答案:

答案 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']