杀死正在使用正则表达式侦听的端口

时间:2014-12-18 23:01:36

标签: python regex

我正试图在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(这可能是任何其他数字)

修改 可能有多个值,因为可能有多个进程。

4 个答案:

答案 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'