Regex查找第二次出现的条目



我不是正则表达式专家。因此,我的技能被打败了。考虑以下文本:

[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*(.*)

有效地将节标题和名称捕获到组12中。

实施

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')]

最新更新