使用Python使用正则表达式仅从字符串中提取特定值
我正试图使用正则表达式从字符串中提取特定的文本值,但由于在需要提取值的关键字的开头之间没有空格,因此出现了错误。 查找以提取关键字的值开始 尝试使用PyPDF2和pdfminer,但出现错误使用Python使用正则表达式仅从字符串中提取特定值,python,regex,dataframe,regex-group,pypdf2,Python,Regex,Dataframe,Regex Group,Pypdf2,我正试图使用正则表达式从字符串中提取特定的文本值,但由于在需要提取值的关键字的开头之间没有空格,因此出现了错误。 查找以提取关键字的值开始 尝试使用PyPDF2和pdfminer,但出现错误 fr = PyPDF2.PdfFileReader(file) data = fr.getPage(0).extractText() 输出:[日期:2020-09-06 20:43:00确认号:3300000266收款人原始发票号:IN05200125634开具日期:06.09.2015税务发票(根据20
fr = PyPDF2.PdfFileReader(file)
data = fr.getPage(0).extractText()
输出:[日期:2020-09-06 20:43:00确认号:3300000266收款人原始发票号:IN05200125634开具日期:06.09.2015税务发票(根据2017年《商品及服务税法案》第31(1)条开具)POLO INDUSTRIES LIMITEDCIN:K253648B85PLC015063GSTIN:3451256132uuy668803E1Z9PAN:BBB7653279K.…]
我希望从上述输出中获取确认号、发布日期、CIN
使用脚本:
regex_ack_no = re.compile(r"Ack No(\d+)")
regex_due_date = re.compile(r"Date of Issue(\S+ \d{1,2}, \d{4})")
regex_CIN = re.compile(r"CIN(\$\d+\.\d{1,2})")
ack_no = re.search(regex_ack_no, data).group(1)
due_date = re.search(regex_due_date, data).group(1)
cin = re.search(regex_CIN, data).group(1)
return[ack_no, due_date, cin]
错误:
AttributeError: 'NoneType' object has no attribute 'group'
当对另一个PDF文件使用相同的脚本时,它的工作格式是表格式的数据。您需要更改regexp模式以匹配数据格式。关键字后面是空格和
:
,您必须匹配它们。日期的格式与模式中的格式不同,CIN
的格式也不同
在调用.group(1)
之前,请检查匹配是否成功。在下面的代码中,如果没有匹配项,我将返回默认值
import re
data = 'Date : 2020-09-06 20:43:00Ack No : 3320000266Original for RecipientInvoice No.: IN05200125634Date of Issue: 06.09.2015TAX INVOICE(Issued u/s 31(1) of GST Act, 2017)POLO INDUSTRIES LIMITEDCIN: K253648B85PLC015063GSTIN: 3451256132uuy668803E1Z9PAN: BBB7653279K .....'
regex_ack_no = re.compile(r"Ack No\s*:\s*(\d+)")
regex_due_date = re.compile(r"Date of Issue\s*:\s*(\d\d\.\d\d\.\d{4})")
regex_CIN = re.compile(r"CIN:\s*(\w+?)GSTIN:")
ack_no = re.search(regex_ack_no, data)
if ack_no:
ack_no = ack_no.group(1)
else:
ack_no = 'Ack No not found'
due_date = re.search(regex_due_date, data)
if due_date:
due_date = due_date.group(1)
else:
due_date = 'Due date not found'
cin = re.search(regex_CIN, data)
if cin:
cin = cin.group(1)
else:
cin = 'CIN not found'
print([ack_no, due_date, cin])
您没有在
确认号
和号码之间匹配:
。您与发行日期之后的:
不匹配。您没有匹配:
在CIN
之后,并且CIN
的格式不是$
后跟一个1-2位小数的数字。换句话说,正则表达式似乎与数据格式根本不匹配。@Barmar-也尝试过使用您提到的上述方法,但没有奏效,现在我正在尝试匹配关键字,以Ack No,Date of Issue,CIN开头,因为我们必须从多个PDF中捕获值。发布日期是\d\d\。\d\d\。\d{4}
,为什么要匹配\d{1,2},\d{4}
?没有抓住要点,请解释一下?谢谢你宝贵的回答,由于我不熟悉这种语言,我只想知道“regex_CIN=re.compile(r“CIN:\s*(\w+?)GSTIN:”),为什么我们在正则表达式中使用GSTIN,我们有不同结构格式的PDF,所以如果GSTIN不存在,会发生什么情况,所以我们必须在脚本中进行更改,有没有一种方法可以在正则表达式中不使用GSTIN来查找CIN。正如我在上面的评论中所说的,在CIN
值之后没有分隔符,因此我使用GSTIN:
来检测结束。您可以使用(?:GSTIN:)?
使GSTIN
可选,但它可能会在CIN中包含其他一些字段。除非你能为如何找到不同的比特定义简单的规则,否则你将很难做到这一点。