【问题标题】:Regex to get lbs and ozs i.e. 16lb 4ozs and it's variations正则表达式获取磅和盎司 i.s. 16 磅 4 盎司及其变化
【发布时间】:2015-05-24 21:24:03
【问题描述】:

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

  • 6lb14ozs
  • 6 磅 14 盎司
  • 6 磅 14 盎司
  • 6 磅 14 盎司
  • 6 磅 14 盎司
  • 6 磅 14 盎司
  • 69 磅 14 盎司
  • 6 磅 14 盎司
  • 6lb14 盎司
  • 6 磅 14 盎司
  • 66lb14ozs
  • 66 磅 14 盎司
  • 65 磅 14 盎司
  • 66lb1ozs
  • 66 磅1盎司
  • 65 磅 1 盎司
  • 6lb14oz
  • 6 磅 14 盎司
  • 6 磅 14 盎司
  • 6 磅 14 盎司
  • 6 磅 14 盎司
  • 6lb14 盎司
  • 6 磅 14 盎司
  • 100 磅 13 盎司

我使用的模式是:

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

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

【问题讨论】:

  • 你想提取什么?这对数字?
  • 最终目标是将这些转换为公斤,但现在我只想将所有匹配项作为字符串输出。

标签: regex regex-greedy


【解决方案1】:
\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

【讨论】:

    【解决方案2】:

    [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]))
    

    【讨论】:

    • 这看起来也很高效……只有 328 步。
    • 我最终使用了 ([0-9]+)[ ]*lbs?[ ]*([0-9]+)[ ]*ozs?并用 ([0-9]?[]\.|\,]?[0-9]+)[ ]*kgs? (请注意,我还寻找了 ,以及 。)
    • 在调试时,这并不是捡起单个物品,例如 18 磅或 8 磅。我怎样才能使第二组成为可选的:regex101.com/r/iA4mU2/2 诚然我错过了原来的问题
    • 只需将对应于 oz 的段放在括号内,后跟 ?。我已经更新了链接中的正则表达式。当然,您还必须调整单位转换代码。
    • 是的,就是这样。如果你的行只是磅,你可以对 lb/lbs 段做同样的事情。
    【解决方案3】:

    类似

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

    应该可以。

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

    【讨论】:

    • 你的方法可能对我的要求更有效。
    【解决方案4】:

    试试这个正则表达式:

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

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

    使用 g 标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-13
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2021-01-04
      • 2020-11-25
      相关资源
      最近更新 更多