【问题标题】:Match non-capturing group multiple times多次匹配非捕获组
【发布时间】:2020-02-01 01:46:12
【问题描述】:

我非常努力地制作了一个好的标题,但我不确定我问的是否正确。这是我最好的尝试:

我正在使用 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] 而不是单词边界,因为15x20 是两个不同的值。

但是它无法匹配 1520 对于 15x20 的情况。如果我在15x 20 中添加一个额外的空间,它确实有效。我如何告诉它在最后“重置”非捕获组,以便它在开始时也适用于非捕获组?

【问题讨论】:

  • 使用(?&lt;=[\sa-z])(?P&lt;values&gt;\d+)(?=[\sa-z]) 或只使用(?&lt;=[\sa-z])\d+(?=[\sa-z]),因为您在这里并不需要命名组。最好的是(?&lt;![^\sa-z])\d+(?![^\sa-z]),它也将匹配字符串的开头/结尾(不确定您是否需要该功能)。
  • 效果很好!我未能将字符串的开头与后向匹配,但真的没有想到这一点!谢谢

标签: python regex regex-group


【解决方案1】:

你可以使用

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

不区分大小写的版本:

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

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

regex demo

详情

  • (?&lt;![^\sa-z]) - 如果紧靠左侧没有空格或小写字母(如果使用 (?i)re.I,则为任何 ASCII 字母),则匹配失败的否定后向查找
  • \d+ - 1 位以上
  • (?![^\sa-z]) - 如果紧靠右侧没有空格或小写字母(如果使用 (?i)re.I,则为任何 ASCII 字母),则匹配失败的负前瞻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多