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

2024-09-26 18:12:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我对使用regex提取Tech-C和Zone-C的名称很感兴趣。这看起来像是一个配置节参与方,不过我可能会使用一个库来解析配置。但是这个摘录是一个更大文件的一部分。因此,配置解析器在这里不起作用。你知道吗

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

TechC_name: regex1
ZoneC_name: regex2

返回Tech-C名称或Zone-C名称的列表?你知道吗

[更新]
我想澄清几点。“Name:”的位置不是固定的,因此可能在条目之前和之后列出相同的点。我更新了我的问题。你知道吗

我认识到有时SectionTitle0(前'Tech-C')和SectionTitle1(前'Zone-C')是相同的。这就更复杂了。可能有一种方法可以构建一个符合第一次出现的'Name:'的正则表达式,以及一个与第二次(或第n次)出现的'Name:'匹配的正则表达式。你知道吗


Tags: name文本名称zone列表技能techregex
3条回答

您可以获得以下格式的输出容易:-你知道吗

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

通过遵循regex imple心理状态:你知道吗

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

输出为:-

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

正则表达式:

\[([^\]]*)\][\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)

您要查找的两个正则表达式是:

技术单位名称:

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

区域名称:

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

相关问题 更多 >

    热门问题