为什么积极的前瞻是有效的,而消极的前瞻是无效的?

2024-04-25 21:46:00 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,regex需要同时适用于python和PCRE(PHP)。我试图忽略正则表达式模式后面是否跟有字母“x”,以便将维度与下面给定示例中的“number/number”之类的字符串区分开来:

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

Tags: 字符串示例number字母模式thisregexword
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

有两个简单选项。你知道吗

第一个选项既难看又长,但基本上是否定紧跟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+)?。这将匹配一个或多个数字,然后可选地匹配.,,后跟一个或多个数字。你知道吗

相关问题 更多 >