我不是正则表达式的专家。因此,我的技能被打败了。请考虑以下文本:
[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:'的正则表达式。
答案 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)