【问题标题】:Regex match on multiple overlapping occurrences?多个重叠事件的正则表达式匹配?
【发布时间】:2020-06-18 08:46:45
【问题描述】:

我的字符串看起来像:

sometext 3x 24x5 x 17.5 x 3 sometext

我想将数字 + 可选空格 + x + 可选空格 + 数字的所有实例连接成数字 + x + 数字。期望的输出:

sometext 3x24x5x17.5x3 sometext

我当前的正则表达式看起来不错,但不知何故它不起作用:

re.sub(r'(\d)\s?([x])\s?(\d)', r'\1\2\3', 'sometext 3x 24x5 x 17.5 x 3 sometext')

产量

sometext 3x24x5 x 17.5x3 sometext

这似乎与 24x5 已被表达式捕获的事实有关,因此它不考虑 5 x 17。我的问题是,如何调整我的正则表达式以达到所需的目的,并且,有没有比我的方法更干净/有效的方法来编写该正则表达式?谢谢!

【问题讨论】:

  • 如果以下解决方案适合您,请考虑选择最佳答案。否则,请提供更多反馈。

标签: python regex


【解决方案1】:

您可以使用 re.sub 来识别所有 number-x 项,然后使用回调从每个匹配项中删除所有空格:

inp = "sometext 3x 24x5 x 17.5 x 3 sometext 1 x 2.3 x 4"
output = re.sub(r'\d+(?:\.\d+)?(?:\s*x\s*\d+(?:\.\d+)?)+', lambda m: re.sub(r'\s', '', m.group(0)), inp)
print(output)

打印出来:

sometext 3x24x5x17.5x3 sometext 1x2.3x4

【讨论】:

    【解决方案2】:

    我建议两种选择:

    import re
    s = 'sometext 3x 24x5 x 17.5 x 3 sometext'
    print (re.sub(r'(?<=\d)\s+(?=x)|(?<=x)\s+(?=\d)', '', s))
    print (re.sub(r'(?<=\d)\s+(?=x\s*\d)|(\d)\s*(x)\s+(?=\d)', r'\1\2', s))
    

    请参阅Python demo。两者都返回sometext 3x24x5x17.5x3 sometext,但第二个似乎更精确。

    Regex #1详情

    • (?&lt;=\d)\s+(?=x) - 数字和x 之间有一个或多个空格
    • | - 或
    • (?&lt;=x)\s+(?=\d) - x 和数字之间的一个或多个空格

    Regex #2详情

    • (?&lt;=\d)\s+(?=x\s*\d) - 数字和x之间的一个或多个空格+零个或多个空格和一个数字
    • | - 或
    • (\d)\s*(x)\s+(?=\d) - 匹配一个数字(捕获到第 1 组),然后是一个或多个空格,然后是 x(捕获在第 2 组中),然后\s+ 匹配 1 个或多个空格,后跟一个数字。

    替换是第 1 组和第 2 组值的串联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2017-11-10
      • 1970-01-01
      • 2012-10-13
      相关资源
      最近更新 更多