正则表达式匹配,如果没有后跟模式

时间:2017-12-16 22:59:43

标签: python regex regex-negation

我需要匹配字符串

  

RHS numberXnumberXnumber

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

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  

我写过:

  

RHS \ d +。?\ d?x \ d +。?\ d?x \ d +。?\ d

但这个匹配也是前三个数字: foo RHS 100x100x100 x10 foo

我怎么能避免这种情况? 基本上我不想要任何匹配,如果有4个号码

2 个答案:

答案 0 :(得分:2)

提供的示例不正确。大多数匹配第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/

答案 1 :(得分:0)

请改用此正则表达式:

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

或者它的紧凑版本:

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