正则表达式得到 lbs 和 ozs 即 16lb 4ozs 及其变体

Regex to get lbs and ozs i.e. 16lb 4ozs and it's variations

我正在尝试获取一个正则表达式模式来匹配以下 lbs 和 ozs,我已经使用了 50% 的方式:https://regex101.com/ 到目前为止:

我使用的模式是:

/(\d|\d\d|\d\d\d)\s*(?:lb|lbs)[^\s]?\s\d?\d\s*(oz|ozs)?[^\s]/g

我相信它也可以做得更好、更有效。

怎么样[0-9]+[ ]*lbs?[ ]*[0-9]+[ ]*ozs?

在您的尝试中,您将单位设为可选,因此它可能会匹配您不希望它匹配的内容。将 's' 设为可选。

干杯, 保罗

要获取数字,您需要 ([0-9]+)[ ]*lbs?[ ]*([0-9]+)[ ]*ozs?

要转​​换成千克,在 Python 中你需要(你的数据在 test_str 中):

import re
p = re.compile(ur'([0-9]+)[ ]*lbs?[ ]*(\d+)\s*ozs?')
test_str = "6lb14ozs\n6 lb 14ozs\n6 lb 14ozs\n6 lb 14 ozs\n6 lbs 14ozs\n6 lb 14ozs\n69 lb 14ozs\n6lb 14 ozs\n6lb14 ozs\n6 lb14 ozs\n66lb14ozs\n66 lb14ozs\n65 lb 14ozs\n66lb1ozs\n66 lb1ozs\n65 lb 1ozs\n6lb14oz\n6 lb14oz\n6 lb 14oz\n6 lb 14 oz\n6lb 14 oz\n6lb14 oz\n6 lb14 oz\n100lb 13ozs"

for i in re.findall(p, test_str):
    print float(i[0]) * 0.45 + float(i[1]) * 0.02

更新

此版本匹配孤立的 lb(s) 和 oz(s),但 's' 不匹配,因此每个匹配度量的最后 2 个字符可用于确定单位并进行转换.新的正则表达式也更易于阅读。

import re
p = re.compile(r"(\d+\s*lb)?s?\s*(\d+\s*oz)?s?\n")    

test_str = "6lb14ozs\n6 lb 14ozs\n6 lb 14ozs\n6 lb 14 ozs\n6 lbs 14ozs\n6 lb 14ozs\n69 lb 14ozs\n6lb 14 ozs\n6lb14 ozs\n6 lb14 ozs\n66lb14ozs\n66 lb14ozs\n65 lb 14ozs\n66lb1ozs\n66 lb1ozs\n65 lb 1ozs\n6lb14oz\n6 lb14oz\n6 lb 14oz\n6 lb 14 oz\n6lb 14 oz\n6lb14 oz\n6 lb14 oz\n100lb 13ozs"

for j in re.findall(p, test_str):
    print (sum ([int (i[:-2]) * {"lb":0.45, "oz":0.02}[i[-2:]] for i in j]))
\d+\s*lbs?\s*\d+\s*ozs?



\d+     One or more digits

\s*     Zero or more spaces

lbs?    lb or lbs

\s*     Zero or more spaces

\d+     One or more digits

\s*     Zero or more spaces

ozs?    oz or ozs

类似

\s*(\d+)\s*(lbs|lb)\s*(\d+)\s*(ozs|oz)

应该可以。

捕获组 0 和 2 将包含金额。

试试这个正则表达式:

(\d+)\D+(\d+)\D+

它捕获两个数字组,并绕过任何非数字组。

使用 g 标志。