我正试图在python中杀死一个监听端口。
os.system("sudo netstat -ap | grep 13000 > net.txt")
f = open("net.txt","r")
fr = f.read()
上述命令的输出为:
udp 0 0*:13000 *:* 5071/python
到目前为止,我有:
regex = re.compile(\d*.(python))
fl = regex.findall(fr)
上面的正则表达式只是打印python。
所以问题是,我如何创建一个正则表达式只取PID值5071
(这可能是任何其他数字)
修改 可能有多个值,因为可能有多个进程。
答案 0 :(得分:2)
您可以使用积极的预测:
>>> s="udp 0 0*:13000 *:* 5071/python"
>>> re.search(r'\d+(?=/python)',s).group(0)
'5071'
甚至只是一个普通的正则表达式和一个组:
>>> re.search(r'(\d+)/python', s).group(1)
'5071'
如果你有多个字符串将上面的命令放在循环中:
for s in string_list:
print re.search(r'(\d+)/python', s).group(1)
答案 1 :(得分:2)
如果这只是一个字符串,您可以跳过findall
并使用re.search()
代替。你也试图编译它的模式周围没有引号。
您可以使用捕获组并引用该组#来获取匹配结果。
>>> re.search(r'(\d+)/python', s).group(1)
'5071'
如果您有多个字符串,则可以使用findall方法将匹配项存储在列表中。
>>> s = '''
udp 0 0*:13000 *:* 5071/python
udp 0 0*:13000 *:* 8000/python
'''
>>> re.findall(r'(\d+)/python', s)
['5071', '8000']
答案 2 :(得分:0)
你可以在不需要正则表达式的情况下完成:
s = "udp 0 0*:13000 *:* 5071/python"
print(s.rsplit(" ",1)[-1].split("/python")[0])
5071
我也会使用subprocess而不是os.system
from subprocess import PIPE,Popen
p1 = Popen(["sudo","netstat", "-ap"], stdout=PIPE)
p2 = Popen(["grep","13000" ], stdin=p1.stdout, stdout=open("net.txt","w"))
p1.stdout.close()
答案 3 :(得分:0)
正则表达基于积极的外观。
(\d+)(?=/python)
输出
>>> re.search('(\d+)(?=/python)', s).group()
'5071'