【问题标题】:Finding all occurrences of alternating digits using regular expressions使用正则表达式查找所有出现的交替数字
【发布时间】:2016-01-03 05:28:35
【问题描述】:

我想使用正则表达式查找字符串中的所有交替数字。交替数字定义为两个相等的数字,中间有一个数字;例如,1212 包含 2 个交替(121 和 212),1111 也包含 2 个交替(111 和 111)。我有以下正则表达式代码:

s = "1212"
re.findall(r'(\d)(?:\d)(\1)+', s)

这适用于“121656”之类的字符串,但不适用于“1212”。我认为这是与重叠匹配有关的问题。我该如何处理?

【问题讨论】:

标签: python regex string


【解决方案1】:
(?=((\d)\d\2))

使用lookahead 获取所有重叠匹配。使用re.findall 并从元组中获取第一个元素。查看演示:

https://regex101.com/r/fM9lY3/54

【讨论】:

  • 为了匹配他的问题,我会使用(\d)(?=(?:\d)(\1))
  • @Roy 我猜他想要121 and 212 而不是1 or 2
【解决方案2】:

您可以使用前瞻来允许重叠匹配:

r'(\d)(?=(\d)\1)'

从这里重建完整的匹配:

matches = re.findall(r'(\d)(?=(\d)\1)', s)
[a + b + a for a, b in matches]

此外,为了避免匹配其他 Unicode 数字(例如 ١)(假设您不想要它们),您应该使用 [0-9] 而不是 \d

【讨论】:

    【解决方案3】:

    使用regex module,您不必使用技巧来获得重叠匹配,因为有一个标志来获取它们:

    import regex
    res = [x.group(0) for x in regex.finditer(r'(\d)\d\1', s, overlapped=True)]
    

    如果 s 只包含数字,你也可以这样做:

    res = [s[i-2:i+1] for i in range(2, len(s)) if s[i]==s[i-2]]
    

    【讨论】:

      【解决方案4】:

      如果字符串仅由数字组成,则为非正则表达式:

      from itertools import islice as isl, izip
      
      s = "121231132124123"
      out = [a + b + c for a, b, c in zip(isl(s, 0, None), isl(s, 1, None), isl(s, 2, None)) if a == c]
      

      输出:

      ['121', '212', '212']
      

      它实际上比正则表达式方法快一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 2021-07-25
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多