Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么积极前瞻有效而消极前瞻无效';T_Python_Regex_Python 3.x - Fatal编程技术网

Python 为什么积极前瞻有效而消极前瞻无效';T

Python 为什么积极前瞻有效而消极前瞻无效';T,python,regex,python-3.x,Python,Regex,Python 3.x,首先,正则表达式需要同时适用于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*(

首先,正则表达式需要同时适用于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)
它可以提取我不想提取的东西,它看起来像。如果我将正向前瞻更改为负,它将捕获除
6,33/523,23
中最后一个“3”之外的两个。看起来像。如何仅捕获
222/2334
?我做错了什么

期望输出:

222/2334
我得到了什么

222/2334 6,33/523,2

您可以将此简化正则表达式与负前瞻一起使用:

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

  • 最后使用单词边界以避免匹配部分数字是很重要的(这是正则表达式匹配之前的一个数字的原因)

  • 还包括负先行条件中的
    [,]?\d
    ,以便匹配不会在最后一个逗号之前的位置结束


这种更短(更高效)的正则表达式也适用于OP:

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

您可以将此简化正则表达式与负前瞻一起使用:

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

  • 最后使用单词边界以避免匹配部分数字是很重要的(这是正则表达式匹配之前的一个数字的原因)

  • 还包括负先行条件中的
    [,]?\d
    ,以便匹配不会在最后一个逗号之前的位置结束


这种更短(更高效)的正则表达式也适用于OP:

(\d+(?:[,.]\d+)*)\s*\/\s*(\d+(?:[,.]\d+)*)\b(?![.,]?\d|\s?x)
有两个简单的选择

第一个选项既难看又长,但基本上会否定字符串上后跟
x
的正匹配,然后匹配没有它的模式

(?!PATTERN(?=x))PATTERN

第二个选项使用所有格量词,但在python中必须使用
regex
模块,而不是
re


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

有两个简单的选项

第一个选项既难看又长,但基本上会否定字符串上后跟
x
的正匹配,然后匹配没有它的模式

(?!PATTERN(?=x))PATTERN

第二个选项使用所有格量词,但在python中必须使用
regex
模块,而不是
re




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

我的意思是。。。它不是很漂亮,但可以用两种语言工作:
(?!\d+(?:[,.]\d+)\s?\/\s?\d+(?:[,.]\d+)(?=\s?x))(\d+(?:[,.]\d+)\s?\/\s?(\d+)(\d+(?:[,.]\d+)
。或者,您可以使用python中的
(\d+(?:[,。]\d+)\s?\/\s?(\d+(?:[,。]\d+)(?!\s?x)
regex
模块来支持所有格量词wow。。。那么快?你能解释一下吗@CTWheels最后一个数字与regexp
\s?x
不匹配,因此,当它与该数字前面的数字匹配时,可以满足负前瞻性。根据您的确切示例,
(^ |)(\d+)\/(\d+)
将意味着。。。它不是很漂亮,但可以用两种语言工作:
(?!\d+(?:[,.]\d+)\s?\/\s?\d+(?:[,.]\d+)(?=\s?x))(\d+(?:[,.]\d+)\s?\/\s?(\d+)(\d+(?:[,.]\d+)
。或者,您可以使用python中的
(\d+(?:[,。]\d+)\s?\/\s?(\d+(?:[,。]\d+)(?!\s?x)
regex
模块来支持所有格量词wow。。。那么快?你能解释一下吗@CTWheels最后一个数字与regexp
\s?x
不匹配,因此当它与该数字前面的数字匹配时,满足负前瞻性。根据您的确切示例,
(^ |))(\d+\/(\d+)($|)
如果flavor设置为python,则第二个正则表达式会在regex101上抛出一个错误,但第一个正则表达式在PHP和python上都有效。@MehmedB是的,这就是为什么我指定您必须使用而不是
re
现在我明白了。我明天会测试它。这看起来很有希望。你的答案几乎完美无瑕,但@anubhava的答案适用于re library(开箱即用)。我必须选择它作为答案。无论如何,谢谢。如果flavor设置为python,则第二个正则表达式在regex101上抛出错误,但第一个正则表达式在PHP和python上都有效。@MehmedB是的,这就是为什么我指定您必须使用而不是
re
现在我明白了。我明天会测试它。这看起来很有希望。你的答案几乎完美无瑕,但@anubhava的答案适用于re library(开箱即用)。我必须选择它作为答案。无论如何,谢谢。短正则表达式在浮动方面有一些问题。它不能匹配22232/233,4这样的浮动,它也将匹配
22232/233,4
。我的正则表达式有一个输入错误,在
\d
之后错过了
+
。它应该是
(\d+(?:[,.]\d+)\s*/\s*(\d+(?:[,.]\d+)\b(?![,]?\d |\s?x)
是的,它正在工作。非常感谢。最后一个问题(我知道这要求太多了)。我试图使这个正则表达式模式成为可选的。我正在添加另一个模式来捕获这些零件旁边的尺寸。但出于某种原因,它并没有变成可选的,而是变成了“必要的”模式,我的意思是,如果您的正则表达式不匹配,它就不会捕获维度。为了使其可选,我将您的正则表达式放在
()
和在其旁边添加
*?
之间。这对我来说有点不清楚。我建议你发一个新问题,并举例说明,以便我能更好地理解它,并尝试提供解决方案