多次匹配non-capturing组

Match non-capturing group multiple times

我真的很努力想取一个好标题,但我不确定我问的是否正确。这是我的最佳尝试:

我正在使用 Python 的正则表达式

我需要使用命名组匹配号码:

15x20x30    ->  'values': [15,20,30]
15bits      ->  'values': [15]
15          ->  'values': [15]
x15         ->  'values': [15]

但不应匹配:

456.48
888,12
6,4.8,4684.,6

到目前为止我最好的尝试是:

((?:[\sa-z])(?P<values>\d+)(?:[\sa-z]))

我使用 [\sa-z] 而不是 word-boundary 因为 15x20 是两个不同的值。

但是 它无法同时匹配 1520 15x20 的情况。如果我在 15x 20 中添加一个额外的 space,它确实有效。我如何告诉它在最后“重置”non-capturing 组,以便它也适用于开头的 non-capturing 组?

您可以使用

(?<![^\sa-z])\d+(?![^\sa-z])

不区分大小写的版本:

(?i)(?<![^\sa-z])\d+(?![^\sa-z])

或者,使用 re.I / re.IGNORECASE 标志编译模式。

regex demo

详情

  • (?<![^\sa-z]) - 如果紧靠左侧没有空格或小写字母(如果 (?i)re.I 是任何 ASCII 字母,则匹配失败的负后视使用)
  • \d+ - 1+ 位数
  • (?![^\sa-z]) - 如果紧靠右侧没有空格或小写字母(如果 (?i)re.I 是任何 ASCII 字母,则匹配失败的否定前瞻使用)