首页 > 解决方案 > 正则表达式在字符之间仅包含一位数字

问题描述

我必须解析一个 PDF 文档,并且我正在使用带有 re(regex) 的 PyPDF2。

该文件包括几行,如下所示:

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')

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

标签: pythonregex

解决方案


我建议使用

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

查看在线 Python 演示。使用此解决方案,您的数据可以以任何字符开头,并且将包含任何字符(不包括换行符,因为您的数据在单行上)。

正则表达式详细信息

  • ^- 字符串的开始
  • \d{2}-\d{2}-\d{5,6}:\d{2}:\d{2}- 日期时间字符串:两位数, -, 两位数, -, 五位或六位, :, 两位数,:两位数
  • (.*?)- 第 1 组:除换行符之外的任何零个或多个字符,尽可能少
  • \d+(?:,\d+)?- 一个 int/float 值模式:1+ 位,后跟 1+ 位的可选,序列
  • $- 字符串结束。

请参阅正则表达式演示


推荐阅读