在Python中使用正则表达式提取字符串并分配给变量
我正在尝试编写一个脚本,它将遍历文本文件,检查特定内容并分配给变量 例如: 文本文件内容:在Python中使用正则表达式提取字符串并分配给变量,python,regex,python-3.x,Python,Regex,Python 3.x,我正在尝试编写一个脚本,它将遍历文本文件,检查特定内容并分配给变量 例如: 文本文件内容: eth0 Link encap:Ethernet HWaddr 08:ee:27:ff:b3:d7 inet addr:10.0.2.45 Bcast:10.3.2.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe00:b3d7/64 Scope:Link UP BROA
eth0 Link encap:Ethernet HWaddr 08:ee:27:ff:b3:d7
inet addr:10.0.2.45 Bcast:10.3.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe00:b3d7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16178 errors:0 dropped:0 overruns:0 frame:0
TX packets:8559 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14045795 (14.0 MB) TX bytes:1355632 (1.3 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:666 errors:0 dropped:0 overruns:0 frame:0
TX packets:666 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:72748 (72.7 KB) TX bytes:72748 (72.7 KB)
我想检查接口eth0上“RX数据包”的值,并将值“16178”分配给变量。我需要能够从这个特殊的块'eth0'中提取这个值
请告诉我从哪里开始
谢谢。您可以使用正则表达式提取值 尝试一种模式:
m = re.match("\W*RX packets[^:]*:(\d+)", line)
在正则表达式中,\d
表示一个数字,+
表示一个或多个。您希望“匹配”文本中的一个或多个数字。括号表示捕获数字中的内容,该数字应在特定文本RX packets:
后找到
您可以在中找到有关正则表达式的更多详细信息
您的代码如下所示:
data= """
eth0 Link encap:Ethernet HWaddr 08:ee:27:ff:b3:d7
inet addr:10.0.2.45 Bcast:10.3.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe00:b3d7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16178 errors:0 dropped:0 overruns:0 frame:0
TX packets:8559 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14045795 (14.0 MB) TX bytes:1355632 (1.3 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:666 errors:0 dropped:0 overruns:0 frame:0
TX packets:666 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:72748 (72.7 KB) TX bytes:72748 (72.7 KB)"""
import re
def findSeq(block,data):
isInRightBlock= False
for line in data.splitlines():
if block in line:
isInRightBlock= True
m = re.match("\W*RX packets[^:]*:(\d+)", line)
if m and isInRightBlock:
isInRightBlock= False
return m.group(1)
res= findSeq("eth0",data)
print res #Your Value
输出:
16178
Banchemark
from datetime import datetime
start_time_1 = datetime.now()
res= findSeq("eth0",data)
print('Duration: {}'.format(datetime.now() - start_time_1))
from datetime import datetime
start_time_2 = datetime.now()
re.search(r'eth0.*?RX packets:(\d+)',data,re.DOTALL).group(1)
print('Duration: {}'.format(datetime.now() - start_time_2))
输出:
Duration: 0:00:00.000547
Duration: 0:00:00.000344
NT:您可以优化它检查正确块的方式。如图所示,使用正则表达式可以轻松完成
eth0.*?
指定应提取eth0的数据包,RX数据包:
指定RX数据包后的数字:需要提取,(\d)
对提取的数字进行分组
>>> import re
>>> a="""eth0 Link encap:Ethernet HWaddr 08:ee:27:ff:b3:d7
... inet addr:10.0.2.45 Bcast:10.3.2.255 Mask:255.255.255.0
... inet6 addr: fe80::a00:27ff:fe00:b3d7/64 Scope:Link
... UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
... RX packets:16178 errors:0 dropped:0 overruns:0 frame:0
... TX packets:8559 errors:0 dropped:0 overruns:0 carrier:0
... collisions:0 txqueuelen:1000
... RX bytes:14045795 (14.0 MB) TX bytes:1355632 (1.3 MB)
...
... lo Link encap:Local Loopback
... inet addr:127.0.0.1 Mask:255.0.0.0
... inet6 addr: ::1/128 Scope:Host
... UP LOOPBACK RUNNING MTU:65536 Metric:1
... RX packets:666 errors:0 dropped:0 overruns:0 frame:0
... TX packets:666 errors:0 dropped:0 overruns:0 carrier:0
... collisions:0 txqueuelen:0
... RX bytes:72748 (72.7 KB) TX bytes:72748 (72.7 KB)"""
>>> re.search(r'eth0.*?RX packets:(\d+)',a,re.DOTALL).group(1)
'16178'
分配什么给变量?我将有一个脚本,需要读取这些值并分配给变量。一旦赋值,我将不得不对这些变量进行一些计算。谢谢。这似乎是
ifconfig
的一个输出,您为什么要使用python来执行此操作,因为您可以在Shell中轻松地执行此操作是的,我知道它看起来很奇怪。但这只是一个示例,目标数据将是具有各种输出的文本文件,大文件GB的数据。目前,我正在努力想办法做这件事。如何找到我要查找的内容并将其分配给变量。。。谢谢你,这帮了大忙,谢谢。您能否解释这行“m=re.match(“\WRX数据包[^:::]:\D*(\D+),line)”-这个正则表达式如何只提取我正在寻找的值,而不是整个值?谢谢你,这很有用。谢谢你的帮助@塔哈:这种基准并不能证明什么,因为数据量非常小,你至少需要重复搜索10000x才能获得有意义的东西。作为一种体验,尝试颠倒测试顺序并查看新结果。感谢您的评论,查看他在原始帖子中的评论“这只是一个示例,目标数据将是具有各种输出的文本文件,大文件GB的数据。”。我试图与其他正确答案进行比较,以强调快速性。+1请注意,使用这种模式可以减少“非贪婪行走”的次数:(?m)^eth0\s(?:++\n)*?\s+RX数据包:([0-9]+)
,即逐行而非逐字符的非贪婪行走。
>>> re.findall('eth0.*?RX packets:(\d+)',x,re.DOTALL)
['16178']