我应该使用正则表达式回头搜索这个字符串吗?

时间:2014-06-11 18:50:43

标签: regex python-3.3

我的目标: 当我通过ping不同的子网时,需要从字符串中提取IP地址。

我将搜索的字符串示例:

>>> pingout = subprocess.getoutput('ping -c' + ' ' + str(1) + ' ' + '10.20.' + str(234.) + str(4))
>>> print(pingout)
PING 10.20.234.04 (10.20.234.4) 56(84) bytes of data.
64 bytes from 10.20.234.4: icmp_seq=1 ttl=64 time=4.01 ms

--- 10.20.234.04 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 4.016/4.016/4.016/0.000 ms
  
    

>

  

我想使用这样的东西。

match = re.search(r'?<=...........)ping', pingout)

或者这个但是需要在结果中排​​除'ping'。

match = re.search(r'.............ping',pingout)

4 个答案:

答案 0 :(得分:1)

假设:

txt='''\
PING 10.20.234.04 (10.20.234.4) 56(84) bytes of data.
64 bytes from 10.20.234.4: icmp_seq=1 ttl=64 time=4.01 ms

--- 10.20.234.04 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 4.016/4.016/4.016/0.000 ms'''

对于第一个IP地址(行中有“PING”),您可以执行以下操作:

print(re.search(r'^PING\s*(\d+\.\d+\.\d+\.\d+)', txt, re.M).group(1))

对于第二个IP地址(行中有'ping'),您可以执行以下操作:

print(re.search(r'^\D+(\d+\.\d+\.\d+\.\d+)\s*ping', txt, re.M).group(1))

无论是哪种情况,都会打印10.20.234.04

答案 1 :(得分:0)

试试这个正则表达式,

match = re.search(r'.*PING ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*', PINGOUT)
match.group(1)

示例:

>>> match = re.search(r'.*PING ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*', "PING 10.20.234.04")
>>> match.group()
'PING 10.20.234.04'
>>> match.group(1)
'10.20.234.04'

答案 2 :(得分:0)

您可以使用大量不同的正则表达式来提取这些IP,我认为与您的解决方案最接近的是:

>>> s
'--- 10.20.234.04 ping statistics ---'
>>> re.findall(".{12}(?= ping)", s)
['10.20.234.04']

但;

>>> import socket
>>> socket.gethostbyname("google.com")
'173.194.39.199'

我认为会好得多(不知道它是否适用于子网,但我认为它们必须是相同的。)。

答案 3 :(得分:0)

>>> import re
>>> m = re.match(r"PING .+ \((.+)\) .+ bytes of data.", "PING 10.20.234.04 (10.20.234.4) 56(84) bytes of data.")
>>> m
>>> m.groups()
('10.20.234.4',)

如果我要反复使用正则表达式,我会这样做:

ip_re = re.compile(r"PING .+ \((.+)\) .+ bytes of data.")
m = ip_re.match(pingout)

请注意,当ping打印第一行时,这恰好会捕获一次IP。无需继续搜索。如果需要,可以扩展正则表达式以捕获发送的数据量或响应。