在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']