gpt4 book ai didi

python多行正则表达式

转载 作者:太空狗 更新时间:2023-10-30 00:41:57 25 4
gpt4 key购买 nike

我在为多行匹配编译正确的正则表达式时遇到问题。有人可以指出我做错了什么。我正在遍历一个包含数百个条目的基本 dhcpd.conf 文件,例如:

host node20007                                                                                                                  
{
hardware ethernet 00:22:38:8f:1f:43;
fixed-address node20007.domain.com;
}

我已经得到各种正则表达式来处理 MAC 和固定地址,但无法将它们组合起来以正确匹配。

f = open('/etc/dhcp3/dhcpd.conf', 'r')
re_hostinfo = re.compile(r'(hardware ethernet (.*))\;(?:\n|\r|\r\n?)(.*)',re.MULTILINE)

for host in f:
match = re_hostinfo.search(host)
if match:
print match.groups()

目前我的匹配组如下所示:
('硬件以太网 00:22:38:8f:1f:43', '00:22:38:8f:1f:43', '')

但寻找类似的东西:
('硬件以太网 00:22:38:8f:1f:43', '00:22:38:8f:1f:43', 'node20007.domain.com')

最佳答案

更新 我刚刚注意到您获得结果的真正原因;在你的代码中:

for host in f:
match = re_hostinfo.search(host)
if match:
print match.groups()

host 指的是单行,但您的模式需要跨两行工作。

试试这个:

data = f.read()
for x in regex.finditer(data):
process(x.groups())

其中 regex 是匹配两行的编译模式。

如果你的文件很大,并且你确定感兴趣的部分总是分布在两行中,那么你可以一次读一行文件,检查模式第一部分的行,设置标志告诉您是否应该为第二部分检查下一行。如果您不确定,它会变得越来越复杂,也许足以开始查看 pyparsing模块。

现在回到最初的答案,讨论您应该使用的模式:

您不需要 MULTILINE;只匹配空格。使用这些构建 block 构建您的模式:

(1)固定文字(2) 一个或多个空白字符(3) 一个或多个非空白字符

然后放在括号中以获得您的组。

试试这个:

>>> m = re.search(r'(hardware ethernet\s+(\S+));\s+\S+\s+(\S+);', data)
>>> print m.groups()
('hardware ethernet 00:22:38:8f:1f:43', '00:22:38:8f:1f:43', 'node20007.domain.com')
>>>

请考虑使用“详细模式”...您可以使用它来准确记录哪些片段模式匹配哪些数据,它通常可以帮助首先获得正确的模式。示例:

>>> regex = re.compile(r"""
... (hardware[ ]ethernet \s+
... (\S+) # MAC
... ) ;
... \s+ # includes newline
... \S+ # variable(??) text e.g. "fixed-address"
... \s+
... (\S+) # e.g. "node20007.domain.com"
... ;
... """, re.VERBOSE)
>>> print regex.search(data).groups()
('hardware ethernet 00:22:38:8f:1f:43', '00:22:38:8f:1f:43', 'node20007.domain.com')
>>>

关于python多行正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4740739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com