正则表达式匹配数字组,后跟或不跟空格,单词

时间:2020-02-03 19:47:35

标签: python regex

我正试图与正则表达式匹配:

101.6 x 101.6 mm
150   x      150 mm
490 x 100 x 380 mm
490 x 100 x 380 x 430 mm
280mm x 260 mm

并将值(数字)提取为单独的组。 我正在使用:

^(?P<value>[-\.\d]+)([\s]*)([x]+) 

但是,我想要一些与数字显示次数无关的东西。

我想作为团体获得的东西:

101.6, 101.6, mm
150, 150, mm
490, 100, 380, mm
490, 100, 380, 430, mm
280, 260, mm

我知道,可以按原样完成拆分,但是除了上面的示例外,我还有其他包含“ x”的表达式,在这种情况下,我不想拆分。

1 个答案:

答案 0 :(得分:1)

鉴于示例数据中的所有字符串都以mmmm结尾,也可以有选择地出现在一个数字之后,因此您可以匹配一个可选的出现并使用正向查找来断言该字符串也以mm结尾,并且两者之间只有允许的部分。

如果要匹配多个空格,为清楚起见,可以在括号中使用[ ]+。如果除换行符以外,还有更多种类的whitspace,可以使用[^\S\r\n]*

基于多个空格,您可以使用

\b(?P<value>\d+(?:\.\d+)?)(?: *mm)?(?=(?: +x +\d+(?:\.\d+)?)* mm\b)

Regex demo | Python demo

例如

import re

regex = r"\b(?P<value>\d+(?:\.\d+)?)(?: *mm)?(?=(?: +x +\d+(?:\.\d+)?)* mm\b)"

test_str = ("101.6 x 101.6 mm\n"
    "150   x      150 mm\n"
    "490 x 100 x 380 mm\n"
    "490 x 100 x 380 x 430 mm\n"
    "280mm x 260 mm")

print(re.findall(regex, test_str))

输出

['101.6', '101.6', '150', '150', '490', '100', '380', '490', '100', '380', '430', '280', '260']