-6

所以我有一个文档(纯文本),我试图从中提取所有 IP 地址。我能够使用正则表达式提取它们,但它也获取了大量的版本号。我尝试使用string.find(),但它要求我能够找到用于行尾的转义字符(IP 地址始终是一行中的最后一件事),并且我不知道用于行尾的转义字符. 有谁知道我怎么能把这些地址拿出来?

4

2 回答 2

3

如果您的地址总是在一行的末尾,那么就锚定:

ip_at_end = re.compile(r'(?:[0-9]{1,3}\.){3}[0-9]{1,3}$', re.MULTILINE)

此正则表达式仅匹配行尾的点状四边形(4 组数字,中间有点)。

演示:

>>> import re
>>> ip_at_end = re.compile(r'(?:[0-9]{1,3}\.){3}[0-9]{1,3}$', re.MULTILINE)
>>> example = '''\
... Only addresses on the end of a line match: 123.241.0.15
... Anything else doesn't: 124.76.67.3, even other addresses.
... Anything that is less than a dotted quad also fails, so 1.1.4
... does not match but 1.2.3.4
... will.
... '''
>>> ip_at_end.findall(example)
['123.241.0.15', '1.2.3.4']
于 2013-05-24T20:44:58.967 回答
2

描述

这将匹配并验证 ipv4 地址,并确保各个八位字节在 0-255 范围内

(?:([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])

在此处输入图像描述

免责声明

是的,我意识到 OP 要求提供 Python 解决方案。此 PHP 解决方案仅用于展示表达式的工作原理

例子

<?php
$sourcestring="this is a valid ip 12.34.56.78
this is not valid ip 12.34.567.89";
preg_match_all('/(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/i',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

$matches Array:
(
    [0] => Array
        (
            [0] => 12.34.56.7
        )

)
于 2013-05-24T20:56:31.400 回答