Perl 转 Python 正则表达式

2 投票
4 回答
627 浏览
提问于 2025-04-16 21:40

怎么把这个转换成Python代码呢?这个正则表达式是用来匹配IPv4地址的,但有没有更好的方法来匹配呢?

if ($line =~ m{\s+id\s+(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}),\s+data\s+(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}),\s+Type Transit\s+(\d{1,2})}) {
    $id = "$1.$2.$3.$4";
    $data = "$5.$6.$7.$8";
}

4 个回答

1

这里有一个解决方案,它改进了正则表达式,并且增加了对IP地址的验证。

import re

match = re.match(r'\s+id\s+((?:\d+\.){3}\d+),\s+data\s+((?:\d+\.){3}\d+),\s+Type Transit\s+(\d{1,2})', line)
if match:
    id, data = match.group(1, 2)
    # Now actually check the IP addresses.
    _i, _d = id.split('.'), data.split('.')
    if (len(_i) != 4 or not all(s.isdigit() and 0 <= int(s) < 256 for s in _i)
    or len(_d) != 4 or not all(s.isdigit() and 0 <= int(s) < 256 for s in _d)):
        # Cancel that, hit an invalid IP address
        del id, data
        match = None
2

用正则表达式来检查一个IP地址真的是个好主意吗?可能不是。

其实可以把这个字符串按照点分开,然后检查每一部分是不是在0到255之间的整数。这样做对电脑来说,几乎比用正则表达式解析字符串要简单得多。

另外,你可以看看这个问题的答案:如何在Python中验证IP地址? -- 有很多不错的方法可以验证IP地址,而不需要用正则表达式。(不过说实话,这个问题的至少一个答案确实提供了一个很全面的正则表达式,适用于IPv4和IPv6地址)

希望这些对你有帮助。

5

这段内容是关于编程问题的讨论,主要是在讲解一些技术细节。虽然具体的问题没有被提到,但可以看出,大家在分享自己的经验和解决方案。编程中常常会遇到各种各样的挑战,大家通过交流来找到更好的办法来解决这些问题。

在这个过程中,可能会提到一些代码示例,帮助理解具体的实现方式。代码块通常用来展示具体的代码,方便大家参考和学习。

总之,这里是一个学习和分享的地方,大家都在努力让编程变得更简单、更易懂。

match = re.search(r"\s+id\s+(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}),\s+data\s+(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}),\s+Type Transit\s+(\d{1,2})", subject)
if match:
    id   = ".".join(match.group(1,2,3,4))
    data = ".".join(match.group(5,6,7,8))
else:
    # Match attempt failed

撰写回答