Skip to main content
 首页 » 编程设计

python之使用正则表达式解析目录

2024年09月07日44小虾米

我正在尝试使用正则表达式解析目录。通常提取的行如下所示:

4.1.2 行政 ............................................... ..................................................... ..........我-我

或者用空格代替点。我需要解析的是节号 - 在本例中为 4.1.2 - 节名称 - 管理 - 和页码 - 在本例中为 I-i。

到目前为止,对于节号,我有:

.*(?=[.]{3,}|[ ]{3,}) 

但是当然这会返回 4.1.2 Administrative。首先,我需要某种后向断言来寻找以下可能的组合:

  1. X、X.、X.X、X.X.、X.X.X 等,其中 X 代表数字

从那里我会得到部分名称,然后我需要另一个 RE 来得到部分编号 X、X.、X.X、X.X. 等。 最后我需要一个 RE 来获取页码。我想做这样的事情:

(?<=[.]{3,}|[ ]{3,}).* 

当然上面的 RE 是行不通的,因为 look-behinds 不支持量词如 {3,}

我想要结束的是

sectionNumber = "4.1.2" 
sectionName = "Administrative" 
pageNumber = "I-i" 

如有任何帮助,我们将不胜感激。

请您参考如下方法:

这是一个可以与 re.findall 和不区分大小写的标志一起使用的正则表达式:

r'^([\d.]{1,5})\s([a-z]+)\s\.{10,}\s([\w-]+)' 

演示:

In [39]: re.findall(r'^([\d.]{1,5})\s([a-z]+)\s\.{10,}\s([\w-]+)', s, re.I) 
Out[39]: [('4.1.2', 'Administrative', 'I-i')] 

Note-1: 中间的点被\.{10,} 捕获,你可以根据需要将重复次数更改为更合适的次数。此外,尾随数字与 [\w-]+ 匹配,这意味着它可以将单词字符(数字和字母)的任意组合与 - 匹配。我建议您使用一组正确的字母字符,您确定这些字符在该部分加上字符类中的 -。

注意 2:关于 ([\d.]{1,5}) 匹配节号,如果你认为其中可能有一个几位数字我建议使用具有更高范围编号的 ([\d.]+) 或 ([\d.]{1,8})。