如何匹配数字和点序列



我正试图通过提取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)

最新更新