【问题标题】:how to detect a repeated pattern in a string using re module of python如何使用python的re模块检测字符串中的重复模式
【发布时间】:2014-08-06 21:15:55
【问题描述】:

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

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

【问题讨论】:

  • 我如何检查它?”:如果你想检查你的正则表达式是否在运行,你可以查看debuggex.comregex101.comHere's what your regex is currently doing。在我看来,ee:ff 不适合。 “字符串可以在这里结束或继续重复字母部分=字母部分的模式,用逗号分隔”。 ee:ff 用冒号而不是等号分隔。
  • 另外,您期望输出什么?你想要['rr=uu,ii=oo,ff==ee'] 还是['rr=uu','ii=oo','ff=ee']
  • @skamazin 我更正了ee:ff 部分。另外,实际上我什么都不想要,我只想检查字符串是否与模式匹配。
  • 如果要检查是否匹配,只需查看它是否在re.findall(...)的返回数组中

标签: python regex string


【解决方案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']

【讨论】:

    【解决方案2】:
    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']
    

    【讨论】:

      【解决方案3】:

      这是一个更易读的正则表达式,应该适合你:

      \S+?:\S+?:(?:\S+?=\S+?.)+
      

      它利用非捕获组(?:...) 和加号+ 重复标记来匹配一个或多个“alphabetical_part=alphabetical_part

      例子:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 2016-11-17
        相关资源
        最近更新 更多