首先,正则表达式需要同时用于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
答案 0 :(得分:2)
您可以在负前瞻的情况下使用此简化的正则表达式:
((\d*(?:,?\.?)\d*(?:,?\.?))\s?\/\s?(\d*(?:,?\.?)\d*(?:,?\.?)))\b(?![.,]?\d|\s?x)
重要的是,请在最后使用单词边界来避免部分数字的匹配(正则表达式匹配到数字前的原因)
还包括[.,]?\d
,其负前瞻性条件使匹配不会在最后一个逗号之前的位置结束。
这个较短(效率更高)的正则表达式也可以用于OP:
(\d+(?:[,.]\d+)*)\s*\/\s*(\d+(?:[,.]\d+)*)\b(?![.,]?\d|\s?x)
答案 1 :(得分:1)
有两个 easy 选项。
第一个选项很丑且很长,但是基本上否定了x
后跟的字符串的正匹配,然后匹配没有它的模式。
(?!PATTERN(?=x))PATTERN
(?!\d+(?:[,.]\d+)?\s?\/\s?\d+(?:[,.]\d+)?(?=\s?x))(\d+(?:[,.]\d+)?)\s?\/\s?(\d+(?:[,.]\d+)?)
第二个选项使用所有格修饰符,但是您必须在Python中使用regex
模块而不是re
。
(\d+(?:[,.]\d+)?+)\s?\/\s?(\d+(?:[,.]\d+)?+)(?!\s?x)
此外,我将您的子模式更改为\d+(?:[,.]\d+)?
。这将匹配一个或多个数字,然后可选地匹配.
或,
,后跟一个或多个数字。