用于替换lis中特殊模式的正则表达式

2024-04-24 03:38:00 发布

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

我一直在编写一个python脚本,在tweet上发布一些关于我pihole的信息,但遇到了一个小问题。我似乎无法让re.sub像我希望的那样为我工作。你知道吗

我试图完成的是获取netifaces.interfaces()的输出,对我来说是['lo', 'ens4', 'tun0', 'tun1'],并使它看起来像ens4, tun0, tun1

我试过使用

netfaces = str(netifaces.interfaces())
netfaces = re.sub('\[|\'|lo|\'|\]', '', netfaces)

但它给了我这个输出:

, ens4, tun0, tun1 

编辑:

谢谢@第四只鸟

我扩展了他们给我的正则表达式,得出了这个结论

regex test

'lo'(?:,\s*)?|[][')(]|(?:,\s*)?'lo'

我的看法:

'lo'(?:,\s*)?-在字符串中搜索'lo',并删除所有已找到的内容

[][')(]-删除所有][')(无论找到什么物质

(?:,\s*)?'lo'-删除所有, 'lo'无论找到什么物质

这也适用于我得到的os.getloadavg()输出


Tags: re脚本信息编辑lointerfacestweetnetifaces
2条回答

得到该结果的原因是,您正在匹配4个可选项,这些可选项也可以写成[][']|lo,但您没有匹配逗号及其后的空格,因此不会删除。你知道吗

如果要从列表中删除'lo',而不在开始处留下逗号和空格,可以使用:

'lo'(?:,\s*)?|[][']
  • 'lo'(?:,\s*)?Match lo后跟可选部分以匹配逗号和1+空格字符
  • |
  • [][']匹配字符类[]'中列出的任何字符

替换为空字符串。你知道吗

Regex demo| Python demo

例如

import re
regex = r"'lo'(?:,\s*)?|[][']"
test_str = "['lo', 'ens4', 'tun0', 'tun1']"
result = re.sub(regex, "", test_str)

if result:
    print (result)

结果

ens4, tun0, tun1

不清楚为什么要生成类似于列表的字符串,但是可以使用这个正则表达式

^[^,]+,\s*|'|\]

然后用空字符串删除它以获得所需的字符串。你知道吗

因为您只想删除第一个逗号和它前面的所有内容,所以需要^[^,]+,\s*,其余部分还需要删除所有引号,使用']以及\]

Regex Demo

作为另一种方法,我假设您最初在列表中有元素,您最好使用这种不依赖regex的方法来获得预期的输出。你知道吗

arr = ['lo', 'ens4', 'tun0', 'tun1']
arr.remove('lo')
print(', '.join(arr))

打印您的预期输出

ens4, tun0, tun1

相关问题 更多 >