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

Python 正则表达式在字符之间只包含一个数字,python,regex,Python,Regex,我必须解析一个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.comp

我必须解析一个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')

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

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

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'

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

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

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

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'

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

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

      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) )
      
      看一看。使用此解决方案,您的数据可以以任何字符开头,并且将包含任何字符(不包括换行字符,因为您的数据位于单行上)

      正则表达式详细信息

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

      我建议使用

      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) )
      
      看一看。使用此解决方案,您的数据可以以任何字符开头,并且将包含任何字符(不包括换行字符,因为您的数据位于单行上)

      正则表达式详细信息

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

      请参阅。

      您的
      \D+
      更改为
      \D\S+
      ,以允许更多。目前,只有一个不清楚的时刻:如果您的期望值以数字结尾怎么办?停止的规则是什么?我已经处理过可能以数字或任何其他字符开头的值,但目前,字符串末尾的数字将阻止捕获任何尾随数字。如果您有
      \D+
      更改为
      \D\S+
      ,以允许更多。目前,只有一个不清楚的时刻:如果您的预期值以数字结尾,该怎么办?停止的规则是什么?我已经处理过可能以数字或数字开头的值