【问题标题】:How to use re to find consecutive, repeated chars如何使用 re 查找连续的重复字符
【发布时间】:2011-11-01 03:29:27
【问题描述】:

我想在一个字符串中找到所有连续的、重复的字符块。例如,考虑以下情况:

s = r'http://www.google.com/search=ooo-jjj'

我想找到这个:wwwooojjj

我试着这样做:

m = re.search(r'(\w)\1\1', s)

但它似乎没有像我预期的那样工作。有什么想法吗?

另外,我如何在 Bash 中做到这一点?

【问题讨论】:

  • 不工作到底如何?它找到第一个匹配项。如果您想一次全部匹配,请尝试findall

标签: python regex


【解决方案1】:

((\w)\2{2,}) 匹配 3 个或更多连续字符:

In [71]: import re
In [72]: s = r'http://www.google.com/search=ooo-jjjj'
In [73]: re.findall(r'((\w)\2{2,})', s)
Out[73]: [('www', 'w'), ('ooo', 'o'), ('jjjj', 'j')]

In [78]: [match[0] for match in re.findall(r'((\w)\2{2,})', s)]
Out[78]: ['www', 'ooo', 'jjjj']

(\w) 匹配任何字母数字字符。

((\w)\2) 匹配任何后跟相同字符的字母数字字符,因为\2 匹配组号 2 的内容。 由于我嵌套了括号,组号 2 指的是与 \w 匹配的字符。

然后把它们放在一起, ((\w)\2{2,}) 匹配任何字母数字字符,后跟重复2 次或更多次 的相同字符。

总的来说,这意味着正则表达式要求字符重复 3 次或更多次。

【讨论】:

  • @Alcott: (\w){2,} 将匹配 any 2 个或更多字符。它不需要字符相同。
  • @Alcott: (\w) 匹配任何字母数字字符。 ((\w)\2) 匹配任何字母数字字符后跟相同的字符,因为\2 匹配组号 2 的内容。由于我嵌套了括号,组号 2 指的是 \w 匹配的字符。然后把它们放在一起,((\w)\2{2,}) 匹配任何字母数字字符,然后是相同的字符重复 2 次或更多次。总的来说,这意味着正则表达式要求字符重复 3 次或更多次。
  • 我可以通过re.search(r'((\w)\2{2,})', s) 完成这项工作吗,它使用search 而不是findall
【解决方案2】:

以下代码应该可以解决您的问题:

s="abc def aaa bbb ccc def hhh"

for match in re.finditer(r"(\w)\1\1", s):
    print s[match.start():match.end()]

【讨论】:

    【解决方案3】:

    几乎可以正常工作,只需将search 替换为finditer。它返回一个迭代器,不是匹配,而是......:

    m = [(x.start(),x.end()) for x in re.finditer(r'(\w)\1\1', s)]
    

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 2014-05-11
      • 2022-12-16
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多