在Python中使用regex提取字符串并分配给变量

2024-06-28 15:50:31 发布

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

我正在尝试编写一个脚本,它将遍历文本文件并检查特定内容并分配给变量。在

例如:

文本文件内容:

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 packets”的值,并将值“16178”赋给变量。我需要能够从这个特定的块'eth0'提取这个值。在

请告知从哪里开始?在

谢谢。在


Tags: 内容byteslinkmaskrxaddrinetpackets
3条回答
>>> re.findall('eth0.*?RX packets:(\d+)',x,re.DOTALL)
['16178']

您可以使用正则表达式来提取值。在

尝试一种模式:

m = re.match("\W*RX packets[^:]*:(\d+)", line)

在正则表达式中,\d表示一个数字,+表示一个或多个。你想“匹配”文本中的一个或多个数字。方括号的意思是捕捉到一个数字,这个数字应该在一个特定的文本RX packets:之后找到。在

您可以在official doc.中找到有关正则表达式的更多详细信息

你的代码应该是:

^{pr2}$

输出:

^{3}$

班切马克

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:您可以优化它检查右块的方式。在

使用Regex可以很容易地完成,如图所示;eth0.*?指定应该提取膨胀到eth0的数据包,RX packets:指定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'

相关问题 更多 >