我正在尝试使用正则表达式解析目录。通常,提取的行看起来如下:
4.1.2行政........................................... .................................................. .................. Ii
或空格而不是点。我需要解析的是节号 - 在本例中为4.1.2 - 节名称 - 管理 - 和页码 - 在本例中为I-i。
到目前为止,我有以下部分:
.*(?=[.]{3,}|[ ]{3,})
但当然这会返回4.1.2管理。首先,我需要某种寻找后面的断言,寻找以下可能的组合:
从那里我得到部分名称,然后我需要另一个RE来获得部分编号X,X.,X.X,X.X。等。 最后我需要一个RE来获取页码。我想做类似的事情:
(?<=[.]{3,}|[ ]{3,}).*
但是当然上面的RE不起作用,因为后视不支持量词,如{3,}
我最终想要的是
sectionNumber = "4.1.2"
sectionName = "Administrative"
pageNumber = "I-i"
任何这些帮助都将不胜感激。
答案 0 :(得分:2)
以下是一个可以与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')]
注意 - 1:中间点被\.{10,}
捕获,如果您愿意,可以将重复次数更改为更合适的点。尾随号码也与[\w-]+
匹配,这意味着它可以匹配任何单词字符组合(数字和字母)与-
。我建议你使用一组正确的字母字符,你肯定会在字符类中加上-
加上([\d.]{1,5})
。
注意事项2:关于([\d.]+)
如果您认为其中可能包含多位数字,我会建议您使用([\d.]{1,8})
或form
更高的范围。