如何在Python中重复regex的特定部分?

2024-04-25 18:17:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python做一个信息检索任务,我试图从PDF文件中提取发票号,为此我将它们转换成字符串(保持原始格式),一些PDF文件有多个表格式的发票号。以下是一张PDF发票的示例:

Invoice Number Date         Ac.No.      Type         Amount

1654339087      28.01.2019  1508765556  Invoice      1,268.40
1655214567      18.12.2018  3508753550  Invoice      3,134.20
1609833445      12.02.2019  2500444556  Invoice      2,735.84

为了从这些表中提取发票号,我创建了一个Regex,它帮助我从这些表中提取发票号,为了从多行中捕获发票号,我重复了Regex的最后一部分,例如在上面的场景中,我将重复Regex的最后一部分(.+\n(\d{5,}))3次,这工作正常,但问题是,我不知道有多少这样的行可以在PDF文件例如10,20。在这种情况下,我需要重复regex的这一部分,等于行数,我正在寻找一个有效的解决方案,在regex中我可以提到一个数字(等于行总数),或者将regex与一些要重复的数字相乘。你知道吗

例如:(.+\n(\d{5,})*10)或(.+\n(\d{5,}){10})。我发现很少有类似的答案(不完全相同)提到使用{}传递数字,但这在我的案例中不起作用。下面是我创建的正则表达式:

pattern = re.compile(r'Invoice Number\s*[A-Za-z0-9-._:\s]+\n(\d{5,}).+\n(\d{5,}).+\n(\d{5,})',re.IGNORECASE | re.MULTILINE)

预期的输出是(我现在通过重复regex的一部分3次得到):

1654339087
1655214567
1609833445

感谢您的帮助!!你知道吗


Tags: 文件字符串re示例numberdatepdf格式
2条回答

您可以尝试从第二行开始逐行读取文件:

f = open('your_file.txt')
line = f.readline()      # consume the header

while line:
    line = f.readline()
    print(re.search(r'^\d+', line).group())  # print the invoice number

f.close()

正如@Wiktor Stribiżew在另一个SO postCapture repeated groups in python regex上所建议的那样 下面的解决方案对我使用regexhttps://pypi.org/project/regex/有效:

import regex
pattern = r'(?:^(?=.*Invoice Number)|\G(?!^)).*?\s*[A-Za-z0-9-._:\s]+\n(\d{5,})'##Capture digit only having length more than 5
print(regex.findall(pattern,text,regex.M))

相关问题 更多 >

    热门问题