我正在尝试匹配简化版本的IP地址(我相信这种模式应该匹配所有IP地址,然后是一些不是IP地址的东西,但这并不重要。)我正在使用这种语法的Python:
'([0-9]{1,3}\.){3}[0-9]{1,3}'
然而,这与“127”相匹配。据我所知,它将我所提供的内容解释为模式列表而不是单个模式列表。我错过了什么?
更新:是的,对不起大家,我有一个错字。我修好了。
每个人都说这种模式是完美的,但我没有得到。也许我的问题出在其他地方:
matches = regex.findall(line)
for match in matches:
matchList.add(label + match)
如果我使用模式'('\ d {1,3}。\ d {1,3}。\ d {1,3}。\ d {1,3}'(相同的,我只是重复,这完美地工作并提供一个完整的IP地址。但是,如果我使用上面的模式,它反而给出'195。'
如果我在这个表达式周围加上'((\ d {1,3}。){3} \ d {1,3})',标签+匹配给我错误'无法连接字符串和元组对象'
答案 0 :(得分:2)
快速回答,请改用:
(?:[0-9]{1,3}\.){3}[0-9]{1,3}
答案很长:
以127.0.0.1为例,您发布的正则表达式只匹配“0”。而不是完整的地址。您正在使用的括号创建一个匹配组,它告诉解析器确保找到整个模式,但只返回匹配()组中的内容,这将留下“127.0.0。”。加上正则表达式默认是贪婪的,并会自动选择最远/最后可能的匹配。因此,在这种情况下括号后面的{3}有点像索引,你最终会得到第三个匹配,因此“0”。
一组括号本身会创建一个匹配的组,但您想要的是一个不匹配的组。在我上面显示的第一个括号之后添加一个?:表示这个。这样它仍将返回整条线的匹配。这应该为您提供您正在寻找的“简化”正则表达式。
答案 1 :(得分:1)
也许你在发布时输了错误,但是当我使用你的正则表达时,它与“127”不符。或“127.0.0.1”。当我删除无关的反斜杠时,它似乎对我来说很好
In [22]: re.match(r'([0-9]{1,3}\.){3}[0-9]{1,3}', '127.0.0.1')
Out[22]: <_sre.SRE_Match object at 0x1013de5d0>
In [23]: re.match(r'([0-9]{1,3}\.){3}[0-9]{1,3}', '127.')
答案 2 :(得分:0)
试试这个
引自this:
def is_valid_ipv4(ip):
"""Validates IPv4 addresses.
"""
pattern = re.compile(r"""
^
(?:
# Dotted variants:
(?:
# Decimal 1-255 (no leading 0's)
[3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
|
0x0*[0-9a-f]{1,2} # Hexadecimal 0x0 - 0xFF (possible leading 0's)
|
0+[1-3]?[0-7]{0,2} # Octal 0 - 0377 (possible leading 0's)
)
(?: # Repeat 0-3 times, separated by a dot
\.
(?:
[3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
|
0x0*[0-9a-f]{1,2}
|
0+[1-3]?[0-7]{0,2}
)
){0,3}
|
0x0*[0-9a-f]{1,8} # Hexadecimal notation, 0x0 - 0xffffffff
|
0+[0-3]?[0-7]{0,10} # Octal notation, 0 - 037777777777
|
# Decimal notation, 1-4294967295:
429496729[0-5]|42949672[0-8]\d|4294967[01]\d\d|429496[0-6]\d{3}|
42949[0-5]\d{4}|4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|
4[01]\d{8}|[1-3]\d{0,9}|[4-9]\d{0,8}
)
$
""", re.VERBOSE | re.IGNORECASE)
return pattern.match(ip) is not None
答案 3 :(得分:0)
在[0-9]之前是一个错字吗?
如果是这样,如果在整个表达式'(([0-9]{1,3}\.){3}[0-9]{1,3})'
周围添加括号,您将创建一个捕获整个匹配的捕获组。否则你只是抓住你的一部分字符串。