正则表达式提取数维
Regular expression extracting number dimension
我正在使用 python 正则表达式从数据库中提取维度信息。该列中的条目如下所示:
23 cm
43 1/2 cm
20cm
15 cm x 30 cm
我需要的只是条目的宽度(因此对于带有 'x' 的条目,只有第一个数字),但正如您所看到的那样,值无处不在。
根据我在 documentation 中的理解,您可以使用他们的位置访问匹配中的组,所以我想我可以根据返回的组数和返回的内容来确定条目的类型在每个索引处找到。
到目前为止我使用的表达方式是^(\d{2})\s?(x\s?(\d{2}))?(\d+/\d+)?$
,但是它并不完美并且returns 有一些无用的组。有没有更高效更合适的?
编辑:我需要每一行的数字。当只有一个数字时,表示只测量了宽度(包括任何小数部分,例如第 2 行)。当有两个数字时,也测量了高度,但我只需要第一个数字的宽度(例如最后一行)
下面是如何从文本文件执行此操作的示例。
它适用于提供的数据。
f = open("textfile.txt",r')
for line in f :
if 'x'in line:
iposition = line.find('x')
print(line[:iposition])
试试下面的正则表达式,它会捕获第一个数字和可选的小数在第一个 'cm'
之前
import re
regex = re.compile('(\d+.*?)\s?cm') # this will works for all your example data
# or
# this asserted whatever come after the 1st digit group must be fractional number only
regex = re.compile('(\d+(?:\s+\d+\/\d+)?)\s?cm')
>>> regex.match('23 cm').group(1)
>>> '23'
>>> regex.match('43 1/2 cm').group(1)
>>> '43 1/2'
>>> regex.match('20cm').group(1)
>>> '20'
>>> regex.match('15 cm x 30 cm').group(1)
>>> '15'
这个正则表达式应该可以工作 (Live Demo)
^(\d+)(?:\s*cm\s+[xX])
说明
^(\d+)
- 在行首至少捕获一位数字
(?:
- 启动非捕获组
\s*
- 后跟至少零个空白字符
cm
- 后跟文字 c
和 m
\s+
- 后跟至少一个空白字符
[xX]
- 后跟文字 x
或 X
)
- 结束非捕获组
您无需费心去匹配该行的其余部分。
我正在使用 python 正则表达式从数据库中提取维度信息。该列中的条目如下所示:
23 cm
43 1/2 cm
20cm
15 cm x 30 cm
我需要的只是条目的宽度(因此对于带有 'x' 的条目,只有第一个数字),但正如您所看到的那样,值无处不在。
根据我在 documentation 中的理解,您可以使用他们的位置访问匹配中的组,所以我想我可以根据返回的组数和返回的内容来确定条目的类型在每个索引处找到。
到目前为止我使用的表达方式是^(\d{2})\s?(x\s?(\d{2}))?(\d+/\d+)?$
,但是它并不完美并且returns 有一些无用的组。有没有更高效更合适的?
编辑:我需要每一行的数字。当只有一个数字时,表示只测量了宽度(包括任何小数部分,例如第 2 行)。当有两个数字时,也测量了高度,但我只需要第一个数字的宽度(例如最后一行)
下面是如何从文本文件执行此操作的示例。 它适用于提供的数据。
f = open("textfile.txt",r')
for line in f :
if 'x'in line:
iposition = line.find('x')
print(line[:iposition])
试试下面的正则表达式,它会捕获第一个数字和可选的小数在第一个 'cm'
之前import re
regex = re.compile('(\d+.*?)\s?cm') # this will works for all your example data
# or
# this asserted whatever come after the 1st digit group must be fractional number only
regex = re.compile('(\d+(?:\s+\d+\/\d+)?)\s?cm')
>>> regex.match('23 cm').group(1)
>>> '23'
>>> regex.match('43 1/2 cm').group(1)
>>> '43 1/2'
>>> regex.match('20cm').group(1)
>>> '20'
>>> regex.match('15 cm x 30 cm').group(1)
>>> '15'
这个正则表达式应该可以工作 (Live Demo)
^(\d+)(?:\s*cm\s+[xX])
说明
^(\d+)
- 在行首至少捕获一位数字(?:
- 启动非捕获组\s*
- 后跟至少零个空白字符cm
- 后跟文字c
和m
\s+
- 后跟至少一个空白字符[xX]
- 后跟文字x
或X
)
- 结束非捕获组
您无需费心去匹配该行的其余部分。