1

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

[SectionTitle0]
...
Name: NameOfTechC
...

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

我有兴趣使用正则表达式提取 Tech-C 和 Zone-C 的名称。这看起来像一个 config-section-party,尽管我可能会使用一个库来解析配置。但这个摘录是一个更大文件的一部分。因此,配置解析器在这里不起作用。

目前,我用Name:\s?(.+). 在 python 中使用re.findall会返回一个包含两个名称的列表。有没有办法使用类似的东西

TechC_name: regex1
ZoneC_name: regex2

返回 Tech-C 名称或 Zone-C 名称的列表?

[更新]
我想澄清一些观点。“名称:”的位置不固定,因此可能在条目之前列出相同的点,在条目之后列出相同的点。我更新了我的问题。

我认识到有时 SectionTitle0(以前的“Tech-C”)和 SectionTitle1(以前的“Zone-C”)是相同的。这使它有点复杂。可能有一种方法可以构建适合第一次出现的“名称:”和匹配第二次(或第 n 次)出现的“名称:”的正则表达式。

4

3 回答 3

0

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

TechC_名称:

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

ZoneC_name:

re.findall(r"\[Zone-C\]\nName: (.*?)\n", s)
于 2012-08-31T07:48:36.530 回答
0

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

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

通过以下正则表达式实现:-

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

输出将是: -

[('Tech-C', 'NameOfTechC'), ('Zone-C', 'NameOfZoneC')]
于 2012-08-31T08:10:26.787 回答
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)
于 2012-08-31T13:52:45.307 回答