正则表达式找到第二次出现的条目

时间:2012-08-31 07:26:43

标签: python 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:'的正则表达式。

3 个答案:

答案 0 :(得分:0)

您正在寻找的两个正则表达式是:

TechC_name:

re.findall(r"\[Tech-C\]\nName: (.*?)\n", s)

ZoneC_name:

re.findall(r"\[Zone-C\]\nName: (.*?)\n", s)

答案 1 :(得分:0)

您可以轻松获得以下格式的输出: -

[(section1, name1), (section2, name2), ...]

通过遵循正则表达式实现: -

import re
re.findall(r"\[(\S+)\]\nName: (\w+)", t)

输出将是: -

[('Tech-C', 'NameOfTechC'), ('Zone-C', 'NameOfZoneC')]

答案 2 :(得分:0)

正则表达式:

\[([^\]]*)\][\r\n]+(?:(?!Name:).*[\r\n]+)*?Name:\s*(.*)

有效地将部分标题和名称捕获到组\1\2中。

实施

import re

data  = """[SectionTitle0]
...
Name: NameOfTechC
...

[SectionTitle1]
...
Name: NameOfZoneC
...
"""

regexStr = r'\[([^\]]*)\][\r\n]+(?:(?!Name:).*[\r\n]+)*?Name:\s*(.*)'
regex    = re.compile(regexStr)
regex.findall(data)