我不是正则表达式专家。因此,我的技能被打败了。考虑以下文本:
[SectionTitle0]
...
Name: NameOfTechC
...
[SectionTitle1]
...
Name: NameOfZoneC
...
我有兴趣使用正则表达式提取Tech-C和Zone-C的名称。这看起来像是一个配置部分,不过我可能会使用库来解析配置。但这个摘录是一个更大文件的一部分。因此,配置解析器在这里不起作用。
目前,我使用Name:s?(.+)
提取名称。在python中使用re.findall
会返回一个包含这两个名称的列表。有没有办法使用这样的东西
TechC_name: regex1
ZoneC_name: regex2
返回Tech-C名称或Zone-C名称的列表?
[更新]
我想澄清一些问题。"名称:"的位置不是固定的,因此可能在条目之前和之后列出相同的点。我更新了我的问题。
我认识到有时SectionTitle0(前"Tech-C")和SectionTitle1(前"Zone-C")是相同的。这让事情变得有点复杂。可能有一种方法可以构建一个适用于第一次出现的"Name:"的正则表达式,以及一个匹配第二次(或第n次)出现的"Name:"的regex。
Regex:
[([^]]*)][rn]+(?:(?!Name:).*[rn]+)*?Name:s*(.*)
有效地将节标题和名称捕获到组1
和2
中。
实施
import re
data = """[SectionTitle0]
...
Name: NameOfTechC
...
[SectionTitle1]
...
Name: NameOfZoneC
...
"""
regexStr = r'[([^]]*)][rn]+(?:(?!Name:).*[rn]+)*?Name:s*(.*)'
regex = re.compile(regexStr)
regex.findall(data)
您要查找的两个正则表达式是:
技术名称:
re.findall(r"[Tech-C]nName: (.*?)n", s)
区域名称:
re.findall(r"[Zone-C]nName: (.*?)n", s)
您可以很容易地获得以下格式的输出:-
[(section1, name1), (section2, name2), ...]
通过以下regex实现:-
import re
re.findall(r"[(S+)]nName: (w+)", t)
输出为:-
[('Tech-C', 'NameOfTechC'), ('Zone-C', 'NameOfZoneC')]