Python 正则表达式在字符之间只包含一个数字
我必须解析一个PDF文档,我正在使用PyPDF2和re(regex) 该文件包括以下几行: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
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(索引65)和Z(索引90)之间的单个字符(区分大小写)A-Z
匹配任何字符(行终止符除外)*?
量词-在零次和无限次之间进行匹配,匹配次数尽可能少,根据需要进行扩展(惰性)*?
- 正向前瞻(?=\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(索引65)和Z(索引90)之间的单个字符(区分大小写)A-Z
匹配任何字符(行终止符除外)*?
量词-在零次和无限次之间进行匹配,匹配次数尽可能少,根据需要进行扩展(惰性)*?
- 正向前瞻(?=\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组:除换行符以外的任何零个或多个字符,尽可能少(.*)
-一种int/float值模式:1+位,后跟可选的\d+(?:,\d+)
和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组:除换行符以外的任何零个或多个字符,尽可能少(.*)
-一种int/float值模式:1+位,后跟可选的\d+(?:,\d+)
和1+位序列、
-字符串结束$
请参阅。您的
\D+
更改为\D\S+
,以允许更多。目前,只有一个不清楚的时刻:如果您的期望值以数字结尾怎么办?停止的规则是什么?我已经处理过可能以数字或任何其他字符开头的值,但目前,字符串末尾的数字将阻止捕获任何尾随数字。如果您有\D+
更改为\D\S+
,以允许更多。目前,只有一个不清楚的时刻:如果您的预期值以数字结尾,该怎么办?停止的规则是什么?我已经处理过可能以数字或数字开头的值