【问题标题】:regex match if not followed by pattern如果后面没有模式,则正则表达式匹配
【发布时间】:2017-12-16 22:59:42
【问题描述】:

我需要匹配如下字符串:

RHS 号码X 号码X 号码

包含在这样的字符串中:(所有数字都可以有或没有小数部分)

foo RHS 100x100x10 foo  
foo RHS 100.0x100x10 foo  
foo RHS 100.0x100.0x10.0 foo
foo RHS 100x100.0x100x10 foo  
foo RHS 10.0x100.0x10.0x10.0 foo  

我写了这个:

右轴\d+.?\d?x\d+.?\d?x\d+.?\d

但是这个正则表达式也匹配以下字符串的第一组数字: 富 RHS 100x100x100x10 富

我怎样才能避免这种情况? 如果有四组数字,基本上我不想要任何匹配

【问题讨论】:

标签: python regex regex-negation


【解决方案1】:

提供的示例不正确。大多数匹配第 4 行,并且全部匹配第 5 行。它们是正确的,您需要单词边界和否定前瞻,但它们缺少关键部分。

正则表达式匹配点前后的单词边界。这意味着如果第三个数字有小数,搜索将不会运行到行尾,不会看到最后的 x,但 匹配字符串。

作为一种解决方案,您需要使用这种在小数点后检查 x 的负前瞻:(?!\.?\d?x)

以及将搜索包装在单词边界中:\b...\b

我测试了下面的字符串,它可以工作。

\bRHS \d+\.?\d?x\d+\.?\d?x\d+\.?\d?(?!\.?\d?x)\b

示例:https://regex101.com/r/0nzHkN/2/

【讨论】:

    【解决方案2】:

    改用这个正则表达式:

    RHS \d+.?\d?x\d+.?\d?x\d+.?\d?(?!x)
    

    或者它的精简版:

    RHS (\d+.?\d?){3}(?!x)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多