【问题标题】:Regex to match repeating 3 digit groups that aren't made up of 3 identical digits正则表达式匹配不由 3 个相同数字组成的重复 3 个数字组
【发布时间】:2021-12-29 02:27:21
【问题描述】:

我正在尝试匹配出现在英国电话号码中的重复 3 位数组。当具有此模式的组中的 3 个数字相同时,我已经可以得到匹配: r'(\d)\1{2}'

例如当输入为“07119777777”时,我得到两个匹配项:

<re.Match object; span=(5, 8), match='777'>
<re.Match object; span=(8, 11), match='777'>

但是,当输入类似于“07123123123”时,由于 3 位组内的数字不同,因此我没有匹配项。 是否有正则表达式模式可以将它们识别为匹配项?

【问题讨论】:

  • 这个工作(\d{3})\1+吗?
  • 几乎!它确实会找到数字不相同的匹配项,例如对于“07590759759”,匹配变为“759759”,但未找到 0 后的“759”作为匹配。此外,尝试将每个 3 位数组作为单独的匹配项,例如“759”和“759”不是“759759”。
  • 如果能提前将这些表达为需求就好了。

标签: python regex


【解决方案1】:

请您尝试以下方法:

str = "07590759759"
m = re.search(r'(\d{3}).*?(\1).*?(\1)', str)
print(m.groups())

输出:

('759', '759', '759')

[更新]
回答你的附加问题,我想这是不可能的 仅正则表达式。 (可能是,但到目前为止我无法弄清楚。)
这是一种方法:

str = "07590759759012759"
m = re.search(r'(\d{3})((?:.*?\1)+)', str)
m1, m2 = m.groups()                     # m1: first match, m2: remaining sequence of matches
m3 = re.findall(m1, m2)                 # extract multiple m1's out of m2
print([m1] + m3)                        # concatenate them as a list

输出:

['075', '075']

输出可能不是您所期望的,因为上面的代码输出 两次或更多次重复。 如果要限制最多三个或更多重复,请修改re.search() 行为:

m = re.search(r'(\d{3})((?:.*?\1){2,})', str)

那么输出将是:

['759', '759', '759', '759']

【讨论】:

  • 是的,这几乎可以实现我的目标!非常感谢。我唯一能想到的是,这是专门寻找您提供的 3 次重复。想知道是否有一种方法可以搜索任意数量的重复,如果您只需要在模式中调用具有不同数量“.*?(/1)”的类似函数?
  • 感谢您的反馈。我已经用附加代码更新了我的答案。我希望它能满足你的要求。干杯。
  • 非常感谢您的帮助!我对正则表达式非常陌生,并且正在努力使用文档来解决这个问题。
猜你喜欢
  • 2013-04-22
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
  • 2019-10-10
  • 1970-01-01
相关资源
最近更新 更多