Perl到Python正则表达式

2024-04-26 23:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将其转换为Python?regex用于匹配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";
}

Tags: 方法iddataif地址typelineregex
3条回答
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

这里有一个非正则表达式解决方案,如果您关心它,它可以提供更准确的诊断,并且比您对IP地址的诊断更加精确。不过,这只会占用整条线,这可能不是你想要的。在

您需要匹配这样的字符串:id XXX.XXX.XXX.XXX, data XXX.XXX.XXX.XXX, Type Transit XX(在大多数地方使用变量空白)。在

def extract_ip_addresses(line):
    '''
    Extract the 'id' and 'data' IP addresses from lines of the form::

        ' id X.X.X.X, data X.X.X.X, Type Transit X'

    The number following Type Transit must be a number less than 100 but is not returned.
    Whitespace is flexible.
    '''

    try:
        (id_, id), (data_, data), (type_, transit_, type_transit) = [s.split() for s in line.split(',')]
        if not line.startswith(' ') or id_ != 'id' or data_ != 'data' or type_ != 'Type' or transit_ != 'Transit':
            raise ValueError()
    except ValueError:
        raise ValueError("String in wrong format")
    if len(type_transit) > 2 or not type_transit.isdigit():
        raise ValueError("Type Transit is not a one- or two-digit number.")
    _ = id.split('.')
    if len(_) != 4 or not all(c.isdigit() and 0 <= int(c) < 256 for c in _):
        raise ValueError("Invalid IP address for 'id'.")
    _ = data.split('.')
    if len(_) != 4 or not all(c.isdigit() and 0 <= int(c) < 256 for c in _):
        raise ValueError("Invalid IP address for 'data'.")
    return id, data

示例用法:

^{pr2}$

您也可以return,而不是引发ValueError,这取决于您希望如何使用它。然后检查extract_ip_addresses(line) is None而不是{}。在

regex真的是用来检查IP地址的正确工具吗?可能没有。在

只需按点拆分字符串,并验证结果位是否为0-255范围内的整数。几乎可以肯定的是,计算机比用正则表达式解析字符串要省力。在

或者,试着看看这个问题的答案:How to validate IP address in Python?——有很多好方法可以验证不涉及regex的IP地址。(尽管如此,至少有一个问题的答案给出了IPv4和IPv6地址的相当全面的正则表达式)

希望有帮助。在

相关问题 更多 >