匹配整行的正则表达式

4

我是新手脚本编写者,一直在学习如何使用正则表达式。

我想要获取匹配模式的完整行。

我的输出结果为:

64 bytes from 33.33.33.33: icmp_seq=9 ttl=254 time=1.011 ms

--- 33.33.33.33 ping statistics ---
10 packets transmitted, 10 packets received, 0.00% packet loss

我尝试编写一个匹配数据包丢失的正则表达式,并尝试获取完整的行,但是没有成功。

cmd = re.search('(\d*)% packet loss', ping_result[int(i)], re.M|re.I)
print cmd.group()

但是这个输出只打印了:
00% packet loss
00% packet loss

请提供预期输出结果。 - nu11p01n73R
re.group 返回组(捕获)数据 - 并且整行未被捕获。相反,如果正则表达式模式匹配,则仅打印整行(例如每个 ping_result[..])。在这种情况下,当 re.search 返回 None 时,不要打印该行。 - user2864740
3个回答

8

首先,在提供正则表达式字符串时,您希望使用原始字符串,可以通过在字符串前加上r来实现,否则转义序列将被吸收。

\d将匹配数字,但不会匹配它们之间出现的点。由于你想要将其作为一个组,所以你需要r'(\d+\.\d+)'

(如果您使用search而不是match,那么您就不需要担心这个问题):最后,您需要捕获该数字之前行中的所有内容,这可以轻松地通过捕获任意数量的字符*来完成。您的搜索模式变为:

r'.*(\d+\.\d+)% packet loss'

如果你想明确指定行的起始和终止位置,可以使用^(起始)和$(终止)特殊字符。

r'^.*(\d+\.\d+)% packet loss$'

谢谢,这真的很有用,对我很有效。 - user596922
你需要使用一些方法来捕获行中的所有内容,你知道这个限制从哪里来吗?似乎没有局部匹配支持,除非以某种方式完全匹配整行。这与grep命令不同,grep命令可以在字符串的一部分上进行匹配,而“.*<pattern>.*”被隐含地应用。这是否与Python使用的正则表达式引擎有关? - jxramos
1
@jxramos 很久没有看到这个了,看起来 search 没有强制要求,而 match 是必须的:示例 - Ryan Haining
1
@jxramos 我找到了有关此事的注释re.match()仅在字符串开头检查匹配,而re.search()则在字符串中的任何位置检查匹配。 - Ryan Haining

4

尝试

cmd = re.search('^.*\d*% packet loss.*$', ping_result[int(i)], re.M|re.I)
print cmd.group()

'^'和'$'分别匹配行的开头和结尾。 除非你想单独选择数据包丢失,否则不需要使用括号。

2
如果您想打印整行,只需遍历各行并打印包含“packet loss”的行即可。
for line in lines:
    if line.find('packet loss') != -1:
        print line

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接