Python Regex-模式匹配



我正在寻找一种在txt文件中正则化不需要的信息的方法。.txt文件不断变化,因为它是用从网络设备提取特定数据的paramiko脚本生成的。

该文件包含以下内容:

*Flags: X - disabled, R - running 
0  R name="" mtu= l2mtu= mac-address= 
arp=enabled interface-type= mode=station 
ssid="" frequency= band=5ghz-a/n 
channel-width=20/40mhz-XX secondary-frequency="" scan-list=5000-5900 
wireless-protocol= vlan-mode=no-tag vlan-id=1 wds-mode= 
wds-default-bridge=none wds-ignore-ssid=no bridge-mode= 
default-authentication= default-forwarding= default-ap-tx-limit= 
default-client-tx-limit= hide-ssid= security-profile= 
compression=* 

我感兴趣的特定部分是扫描列表=xxxx-xxxx

我一开始使用linux并调用带有子进程的.sh脚本来完成这项工作,该子进程将grep所需的部分,不幸的是,现在我必须在windows系统上实现它,并且无法访问grep。

我目前拥有的代码可以返回扫描列表,但也可以返回随机括号,以下是代码和输出:

代码:

import re
import string
file = open('test.txt', 'r')
for lines in file:
matches = re.match('..........dddd.dddd', lines)
print(matches)
**Output:**
[]
[]
[]
[]
[]
[]
[]
[]
['scan-list=5000-5900']
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]

这一切都很好,但由于括号的原因,我无法将此输出用作另一个函数的输入。

我尝试过.strip((,但遇到了一个类型错误:预期的字符串或字节,如对象,可能是因为内容在文件中,而不是指定的字符串。

我也尝试过使用lambda调用re.sub,但这似乎只返回括号,而不返回扫描列表。

最终,为了绕过这个问题,我试图将输出写入一个辅助临时文件,并用re.sub/re.replacement执行另一个正则表达式以删除括号,但最终正则表达式再次保留了所有括号,但删除了扫描列表部分。

在所有这些都失败之后,我决定回过头来看看regex本身,甚至为"扫描列表\d\d\d-\d\d\d"似乎失败了,删除了除括号外的所有内容。

我现在想知道这些括号是否被诅咒了,我将不得不求助于WSL。有没有一种更简单的方法可以做到这一点,或者我可以去另一个图书馆看看并尝试一下?

这可能是一个非常简单的问题,我相信我的正则表达式字符串可能很糟糕或完全不正确。

import re
import string
file = open('test.txt', 'r')
for lines in file:
matches = re.search('scan-list=d{4}-d{4}', lines)
if matches != None:
print(matches.group())
# Outputs all occurrences line by line.

说明:

  • 对于不在行首的匹配字符串,需要使用re.search而不是re.match。

  • 当一行不包含所需的字符串时,re.search返回None,因此我们避免打印这些字符串。

  • matches.group((/matches.group(0(将返回第一个子组,即整个匹配。

  • 你的正则表达式很好。

最新更新