正则表达式得到 lbs 和 ozs 即 16lb 4ozs 及其变体
Regex to get lbs and ozs i.e. 16lb 4ozs and it's variations
我正在尝试获取一个正则表达式模式来匹配以下 lbs 和 ozs,我已经使用了 50% 的方式:https://regex101.com/ 到目前为止:
- 6lb14ozs
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 69 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 66lb14ozs
- 66 磅 14 盎司
- 65 磅 14 盎司
- 66lb1ozs
- 66 磅 1 盎司
- 65 磅 1 盎司
- 6lb14oz
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 100 磅 13 盎司
我使用的模式是:
/(\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 标志。
我正在尝试获取一个正则表达式模式来匹配以下 lbs 和 ozs,我已经使用了 50% 的方式:https://regex101.com/ 到目前为止:
- 6lb14ozs
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 69 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 66lb14ozs
- 66 磅 14 盎司
- 65 磅 14 盎司
- 66lb1ozs
- 66 磅 1 盎司
- 65 磅 1 盎司
- 6lb14oz
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 6 磅 14 盎司
- 100 磅 13 盎司
我使用的模式是:
/(\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 标志。