为什么正面前瞻有效,而负面前瞻无效?

时间:2019-10-07 19:46:50

标签: python regex python-3.x

首先,正则表达式需要同时用于python和PCRE(PHP)。我试图忽略正则表达式模式后是否带有字母“ x”,以区分尺寸与字符串(例如下面的给定示例中的“数字/数字”):

dummy word 222/2334; Ø14 x Ø6,33/523,23 x 2311 mm

在这里,我尝试提取222/2334而不是6,33/523,23,因为该部分实际上是尺寸的一部分。到目前为止,我想到了这个正则表达式

((\d*(?:,?\.?)\d*(?:,?\.?))\s?\/\s?(\d*(?:,?\.?)\d*(?:,?\.?)))(?=\s?x)

可以提取我不想提取的内容,看起来像this。如果我将正向前瞻更改为负向,则它将捕获6,33/523,23中的最后一个'3'除外的两个索引。看起来像this。如何仅捕获222/2334?我在这里做什么错了?

所需的输出:

222/2334

我得到了

222/2334 6,33/523,2

2 个答案:

答案 0 :(得分:2)

您可以在负前瞻的情况下使用此简化的正则表达式:

((\d*(?:,?\.?)\d*(?:,?\.?))\s?\/\s?(\d*(?:,?\.?)\d*(?:,?\.?)))\b(?![.,]?\d|\s?x)

Updated RegEx Demo

  • 重要的是,请在最后使用单词边界来避免部分数字的匹配(正则表达式匹配到数字前的原因)

  • 还包括[.,]?\d,其负前瞻性条件使匹配不会在最后一个逗号之前的位置结束。


这个较短(效率更高)的正则表达式也可以用于OP:

(\d+(?:[,.]\d+)*)\s*\/\s*(\d+(?:[,.]\d+)*)\b(?![.,]?\d|\s?x)

RegEx Demo 2

答案 1 :(得分:1)

有两个 easy 选项。

第一个选项很丑且很长,但是基本上否定了x后跟的字符串的正匹配,然后匹配没有它的模式。

(?!PATTERN(?=x))PATTERN

See regex in use here

(?!\d+(?:[,.]\d+)?\s?\/\s?\d+(?:[,.]\d+)?(?=\s?x))(\d+(?:[,.]\d+)?)\s?\/\s?(\d+(?:[,.]\d+)?)

第二个选项使用所有格修饰符,但是您必须在Python中使用regex模块而不是re

See regex in use here

(\d+(?:[,.]\d+)?+)\s?\/\s?(\d+(?:[,.]\d+)?+)(?!\s?x)

此外,我将您的子模式更改为\d+(?:[,.]\d+)?。这将匹配一个或多个数字,然后可选地匹配.,,后跟一个或多个数字。