正则表达式在字符之间只包含一个数字

2024-09-23 10:27:52 发布

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

我必须解析一个PDF文档,我正在使用PyPDF2和re(regex)

该文件包括以下几行:

18-02-202010:44:48PEDMILANO OVEST- BINASCOA1,40

我需要从此行中提取时间和金额之间的文本(粗体):

PEDMILANO OVEST- BINASCOA

下面的代码正在运行,但有时此代码找不到任何内容,因为可以是这些字符之间的数字,例如18-02-202010:44:48PEDMILANO OVE3ST- BINASCOA1,40

regex = re.compile(r'\d\d-\d\d-\d\d\d\d\d\d:\d\d:\d\d\D+\d+,\d\d')

有没有办法在这个正则表达式中包含一个数字


Tags: 文件代码文档文本repdf时间数字
2条回答

我建议使用

import re
text = "18-02-202010:44:48PEDMILANO OVEST- BINASCOA1,40"
print( re.sub(r'^\d{2}-\d{2}-\d{5,6}:\d{2}:\d{2}(.*?)\d+(?:,\d+)?$', r'\1', text) )

它也可以写成

re.sub(r'^\d{2}-\d{2}-\d{5,6}:\d{2}:\d{2}|\d+(?:,\d+)?$', '', text)

或者,如果您更喜欢匹配和捕获:

m = re.search(r'^\d{2}-\d{2}-\d{5,6}:\d{2}:\d{2}(.*?)\d+(?:,\d+)?$', text)
if m:
    print( m.group(1) )

online Python demo。使用此解决方案,您的数据可以以任何字符开头,并且将包含任何字符(不包括换行字符,因为您的数据位于单行上)

正则表达式详细信息

  • ^-字符串的开头
  • \d{2}-\d{2}-\d{5,6}:\d{2}:\d{2}-datetime字符串:两位,-,两位,-,五位或六位,:,两位,:两位
  • (.*?)-第1组:除换行符以外的任何零个或多个字符,尽可能少
  • \d+(?:,\d+)?-一种int/float值模式:1+位后跟可选的,和1+位序列
  • $-字符串的结尾

regex demo

以下内容应简化当前的正则表达式:

import re

s = '18-02-202010:44:48PEDMILANO OVE3ST- BINASCOA1,40'

re.search(r'\:\d+([A-Z].*?)(?=\d+\,\d+$)', s).group(1)
# 'PEDMILANO OVE3ST- BINASCOA'

demo

  • \d+([A-Z].*?)(?=\d+\,\d+$)

    • \:匹配字符:字面上(区分大小写)
    • \d+:匹配一个数字(等于[0-9]
    • +量词-在一次和无限次之间匹配,尽可能多地匹配,根据需要返回(贪婪)
    • 第一捕获组([A-Z].*?) 匹配下面列表中的单个字符[A-Z]
      • A-Za(索引65)和Z(索引90)之间的单个字符(区分大小写)
      • .*?匹配任何字符(行终止符除外)
      • *?量词-在零次和无限次之间进行匹配,匹配次数尽可能少,根据需要进行扩展(惰性)
    • 正向前瞻(?=\d+\,\d+$) 断言下面的正则表达式匹配
      • \d+匹配一个数字(等于[0-9]
      • +量词-在一次和无限次之间匹配,尽可能多地匹配,根据需要返回(贪婪) \,匹配字符,字面上(区分大小写)
    • \d+匹配一个数字(等于[0-9]
    • +量词-在一次和无限次之间匹配,尽可能多地匹配,根据需要返回(贪婪)
    • $断言行末尾的位置

相关问题 更多 >