【问题标题】:Parsing different numbers with RegEx使用 RegEx 解析不同的数字
【发布时间】:2017-05-04 21:05:25
【问题描述】:

是否可以解析下面两封电子邮件中的所有“权重”?

我需要一个足够强大的正则表达式来捕获这两封电子邮件的“权重”,以及 100 多封电子邮件。我现在使用的 RegEx 搜索逗号并获取它们两边的数字,这非常适合以千计的重量,但无法捕获低于 1000 的重量,例如下面的 954lbs 和 800lbs 值。

我想也许我可以尝试识别“lbs”并捕获其前面的数字,但在某些情况下价格在“lbs”之前。

任何帮助将不胜感激,谢谢大家。

1) Subject: FW: NEFS 11 fish for lease
   From: Claire Fitz-Gerald 
   Date: 11/15/2013 3:02 PM

   NEFS 11 has the following fish for lease:

   -GOM Cod up to 5,000 lbs (live wt) @ 1.40 lbs
   -American Plaice 2,000 lbs      .60 lbs or best offer



2) From: Claire Fitz-Gerald 
   Date: 9/5/2014 9:52 AM
   Subject: NEFS 5 Available Fish

   All,
   NEFS 5 has the following fish available for lease/trade:

     GB EAST cod: 954 lbs @ $0.83
     GB EAST cod: 1,046 lbs to trade for 1,830 lbs GB WEST cod
     GB blackback: 30,000 lbs @ $0.07
     GOM blackback: 800 lbs @ $0.03
     white hake: 6,322 lbs @ $0.13
     pollock: 22,000 lbs @ $0.015
     redfish: 14,000 lbs @ $0.015
     GB yt: 1,873 lbs @ $1.13
     GB yt: 5,127 lbs to trade for 10,254 lbs SNE yt

我的相关代码:

with open(file_path, 'r') as f:
            pattern = re.compile(r'\d+,\d+ ')
            email = f.read()
            weights = pattern.findall(email)
            data_frame['Weights'].append(weights)
            if weights:
                print("Weight:", ''.join(weights))

打印输出,用于电子邮件 #2:(注意不包括小于 1000 的金额)

Weight: 1,046 1,830 30,000 6,322 22,000 14,000 1,873 5,127 10,254 

【问题讨论】:

  • 我在你的模式中看不到'lbs',但无论如何你可以允许一个逗号与r'(\d+,)?\d+ '之类的东西。
  • 我的代码已经成功识别逗号和周围的数字。我要问的是一种不同的方式(或另一种方式)来捕获小于 1,000 的重量值,因此没有逗号。
  • 我在之前的评论中写道“要么是数字流,要么是带有单个逗号的数字流”。这不是你需要的吗?
  • 这个怎么样:\s([\d,]+)\s*lb 它捕获所有数字和逗号,前面有一个空格,后面是一些空格,后面是lb regex101.com/r/Tpy0So/1
  • 对行首的良好观察。 * 匹配零个或多个空格,因此接受 40000lbs。这是一个更新的正则表达式(?<!\.)([\d,]+)\s*lbregex101.com/r/Tpy0So/2

标签: python regex email


【解决方案1】:

几种方法,一种是

\d[\d,]{2,} lbs

这需要一个数字,后跟数字,逗号一个空格和 lbs 字面意思。见a demo on regex101.com


完整的Python
import re

email = """
2) From: Claire Fitz-Gerald 
   Date: 9/5/2014 9:52 AM
   Subject: NEFS 5 Available Fish

   All,
   NEFS 5 has the following fish available for lease/trade:

     GB EAST cod: 954 lbs @ $0.83
     GB EAST cod: 1,046 lbs to trade for 1,830 lbs GB WEST cod
     GB blackback: 30,000 lbs @ $0.07
     GOM blackback: 800 lbs @ $0.03
     white hake: 6,322 lbs @ $0.13
     pollock: 22,000 lbs @ $0.015
     redfish: 14,000 lbs @ $0.015
     GB yt: 1,873 lbs @ $1.13
     GB yt: 5,127 lbs to trade for 10,254 lbs SNE yt
"""

rx = re.compile(r'(\d[\d,]{2,}) lbs')
weights = rx.findall(email)
print(weights)

working on ideone.com

【讨论】:

  • 但问题是我想要低于1000的值。我当前的 RegEx 可以捕获 1000 以上的所有值,但让我感到困惑的是不带逗号的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多