0

我使用 PDFPlumber 库来提取我的 PDF 中的所有行,示例行提取如下所示:

总回程运输 $16.01

目标是将所有这些放入数据框中。如何使用正则表达式对这条线进行分组,以便我可以隔离收费类型和美元金额?

目前,我有:

totals=re.compile(r"(\ATotal) ([\w]+) ([\w]*)")
for line in text.split("\n"):
    line2=totals.search(line)
    if line2:
        print(line)
        print(line2.group(1))
    else:
        pass

第 1 组返回“总计”,第 2 组返回“返回”,第 3 组返回“运输”,但我无法创建一个检索美元金额的组。有什么建议么?

注意:超过 1000 美元的金额包含一个“,”,这可能需要包含在正则表达式语法中

4

2 回答 2

0

您可以使用具有 4 个捕获组的模式。

请注意,您可以写[\w]为 just \w

使用\w*匹配可选的单词字符,也可能匹配空字符串。

您可以匹配单词字符 1 次以上,并使用匹配左侧 1-3 位数字和逗号的可选部分以及中间的 3 位数字的美元金额模式。

\A(Total) (\w+) (\w+) (\$\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S)
  • \A字符串的开始
  • (Total) 捕获第 1 组中的总计并匹配空格
  • (\w+) 在第 2 组中捕获 1+ 个单词字符并匹配一个空格
  • (\w+) 在第 3 组中捕获 1+ 个单词字符并匹配一个空格
  • (捕获组 4
    • \$\d{1,3}匹配$和 1-3 位数字
    • (?:,\d{3})*(?:\.\d+)?可选择重复 3 位数字并可选择匹配.1 位以上的数字
  • )关闭第 4 组
  • (?!\S)在右侧断言空白边界以防止部分匹配

请参阅正则表达式演示Python 演示

import re
 
strings = [
    "Total Return Transportation $16.01",
    "Total Return Transportation $123,899,116.01",
    "Total Return Transportation $1612.01"
]
 
pattern = r"\A(Total) (\w+) (\w+) (\$\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S)"
 
for s in strings:
    match = re.match(pattern, s)
    if match:
        print(match.group(4))

输出

$16.01
$123,899,116.01
于 2021-06-06T08:58:52.580 回答
0

只需像这样更改您的正则表达式:

totals=re.compile(r"(\ATotal) ([\w]+) ([\w]*) ([\$ ]+?(\d+([,\.\d]+)?))")
>>> totals.search("Total Return Transportation $16.01").group(4)
'$16.01'
>>> totals.search("Total Return Transportation $1,006.01").group(4)
'$1,006.01'
于 2021-06-05T17:58:10.050 回答