Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python使用正则表达式仅从字符串中提取特定值_Python_Regex_Dataframe_Regex Group_Pypdf2 - Fatal编程技术网

使用Python使用正则表达式仅从字符串中提取特定值

使用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

我正试图使用正则表达式从字符串中提取特定的文本值,但由于在需要提取值的关键字的开头之间没有空格,因此出现了错误。 查找以提取关键字的值开始

尝试使用PyPDF2和pdfminer,但出现错误

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中包含其他一些字段。除非你能为如何找到不同的比特定义简单的规则,否则你将很难做到这一点。