我正试图通过提取PDF文件来使用此正则表达式^((d{1,2}.)*)
来匹配此字符串2.1.34.5.1.
。但是,我无法打印此返回。这是输出pdf页面。
93
|
Page
1.5.4 Require Authentication for Single
-
这里发生的事情,匹配的是93
而不是1.5.4
。
import PyPDF2
import re
import sys
if __name__ == '__main__':
pdf_file = open('RH5-94.pdf','rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
IdCis = "(d{1,2}.{0,1})*"
Description = "(?<=Description:)(.*)(?=Rationale)"
Rationale = "(?<=Rationale:)(.*)(?=Audit)"
textPage = read_pdf.getPage(0).extractText()
print(re.search(IdCis,textpage).group(0))
您的第一个示例2.1.34.5.1.
以.
结束,而您的第二个实例1.5.4
则没有。出于这个原因,我假设序列可能会也可能不会以.
结束
不要忘记,为了匹配字面.
,您可以用反斜杠对其进行转义。
为了确保序列中至少有一个.
,使用+
而不是*
来匹配该组至少一次。
^(?:d{1,2}.)+d{0,2}
试试这个:
(d{1,2}.{0,1})*
你的问题是你的正则表达式要求在的末尾有一个点
^((d{1,2}.)*)
能够匹配93的原因是因为点没有转义,因此也可以匹配数字。模式d{1,2}.
的这一部分至少匹配2个字符,最多匹配3个字符。
{1,2}
允许回溯以匹配9,只允许末尾的点与3匹配。例如,它与一个数字不匹配。
由于可以选择使用*
重复该模式,因此它也可以匹配一个空字符串,或者在本例中匹配2位数字。
注意{0,1}
可以写成?
您也可以将模式写成:
d{1,2}(?:.d{1,2})+.?
模式匹配:
d{1,2}
匹配1-2位数字(?:
非捕获组整体重复.d{1,2}
匹配一个点和1-2位数字
)+
关闭非捕获组并重复至少1次,以使没有点的数字不匹配.?
匹配可选点
Regex演示
使用带有负查找的空白边界来防止部分匹配:
(?<!S)d{1,2}(?:.d{1,2})+.?(?!S)