【问题标题】:I want to match a greedy string "ha" more than one time, but it is giving only one match.我想多次匹配一个贪婪的字符串“ha”,但它只匹配一次。
【发布时间】:2016-10-24 07:14:50
【问题描述】:
import re
x=""" hi i am laughing like hahahahahahaha. and i use it regularly"""
y=re.compile(r'(ha){1,5}')
z=y.search(x)
print z.group()

我想在这里多次匹配ha。但它只匹配一次。

【问题讨论】:

  • 不清楚您在问什么 - 在问题中包含问题陈述
  • >>> import re >>> x=""" hi i am laughing like hahahahahahaha. and i use it regularly""" >>> y=re.compile(r'(ha){1,5}') >>> z=y.search(x) >>> print z.group() hahahahaha 这是我的 python 解释器的输出......你的代码是正确的......
  • 在字符串 x 中我给了 ha 七次。我给出的代码只在 ha 上打印。但我想打印 5 次。我的目标是从 7 个 ha 中打印 haha​​hahaha。代码只给出一个。

标签: python regex python-2.7 python-3.x


【解决方案1】:

所以上面的工作正常:

>>> x=""" hi i am laughing like hahahahahahaha. and i use it regularly"""
>>> import re
>>> y=re.compile(r'(ha){1,5}')
>>> z=y.search(x)
>>> z.group()
'hahahahaha'

正如您在声明中提到的在 {1,5} 范围内搜索 ha 并为您提供最大到 5 的贪婪匹配。但如果您希望它匹配所有出现的事件,那么您可以通过此实现它(+ 是贪心)

>>> y=re.compile(r'(ha)+')
>>> z=y.search(x)
>>> z.group()
'hahahahahahaha'

【讨论】:

    【解决方案2】:

    re.search (最多)找到一个匹配项。要查找多个匹配项,您可以使用re.findall,它会返回匹配字符串的列表:

    import re
    
    x = """ hi i am laughing like hahahahahahaha. and i use it regularly"""
    y = re.compile(r'(ha)')
    print(y.findall(x))
    

    输出

    ['ha', 'ha', 'ha', 'ha', 'ha', 'ha', 'ha']
    

    如果您想要实际的 Match 对象而不是字符串,您可以使用 re.finditer:

    import re
    
    x = """ hi i am laughing like hahahahahahaha. and i use it regularly"""
    y = re.compile(r'(ha)')
    for m in y.finditer(x):
        print(m)
    

    输出

    <_sre.SRE_Match object; span=(23, 25), match='ha'>
    <_sre.SRE_Match object; span=(25, 27), match='ha'>
    <_sre.SRE_Match object; span=(27, 29), match='ha'>
    <_sre.SRE_Match object; span=(29, 31), match='ha'>
    <_sre.SRE_Match object; span=(31, 33), match='ha'>
    <_sre.SRE_Match object; span=(33, 35), match='ha'>
    <_sre.SRE_Match object; span=(35, 37), match='ha'>
    

    如果您想找出所有出现的 repeating 模式,则需要稍微不同的策略。一种方法是使用re.search 并在匹配点处截断目标字符串并再次搜索,直到找不到更多匹配项。

    import re
    
    x = """ hi i am laughing like hahahahahahaha. and i use it regularly"""
    y = re.compile(r'(ha){1,5}')
    patlen = 2
    
    target = str(x)
    while True:
        m = y.search(target)
        if not m:
            break
        target = target[patlen + m.start(0):]
        print(m.group(0))
    

    输出

    hahahahaha
    hahahahaha
    hahahahaha
    hahahaha
    hahaha
    haha
    ha
    

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多