正则匹配带空格的IP地址+CIDR

1 投票
1 回答
1072 浏览
提问于 2025-04-18 03:06

我需要一个正则表达式,可以匹配像192.1.2.33/23这样的IP地址,即使中间有空格或换行,比如:

30.0.
0.0/24

我试过这个:

\b(((\s+)?[1-9](\s+)?[0-9]?(\s+)?[0-9]?(\s+)?)\.((\s+)?[0-9](\s+)?[0-9]?(\s+)?[0-9]?(\s+)?)\.((\s+)?[0-9](\s+)?[0-9]?(\s+)?[0-9]?(\s+)?)\.((\s+)?[0-9](\s+)?[0-9]?(\s+)?[0-9]?(\s+)?)\/((\s+)?[0-9](\s+)?[0-9]?(\s+)?))\b

但效果不好……(而且,这个正则表达式太长了!)

任何帮助都很感激。

编辑:

当我在Python中使用它时,有时在遇到换行时,它会把数字去掉。这是我使用的代码:

with open(r"AllText.txt") as fp:
for line in fp:
    for i in re.finditer(regexp_v3, line):
        print i.group()

比如试试这个文本:

 "172.18.177.240/28","ewwefwfwef","172.18.176.240/28","D.edwefwefwef
e_fe","172.18.230.0/24","172.18.177.128/28","dewefgw-1.wefre_fe","172.18.176.128/28","efSwefefef.eI-nc_rwefstowefe","17
2.18.183.0/24","PAT 

编辑 2:

问题是“你是逐行读取文件的,而你的正则表达式总是只针对单独的一行进行匹配。当它只看到行b时,怎么能从行a的末尾开始匹配呢?”

所以,现在的问题是:我该如何一次性读取所有内容,以便正则表达式能看到全部?

1 个回答

1

哪里不太对劲呢?

  • 首先,你可以把 (\s+)? 替换成 \s*。它们的意思是一样的。

  • 在开头和结尾匹配空格其实也没什么意义。

经过这两个“小改进”,你可以得到:

\b(([1-9]\s*[0-9]?\s*[0-9]?\s*)\.(\s*[0-9]\s*[0-9]?\s*[0-9]?\s*)\.(\s*[0-9]\s*[0-9]?\s*[0-9]?\s*)\.(\s*[0-9]\s*[0-9]?\s*[0-9]?\s*)\/(\s*[0-9]\s*[0-9]?))\b

你还可以用 {0,2} 这个量词来让代码更简洁,而不是重复字符类。

\b(([1-9](?:\s*[0-9]){0,2}\s*)\.(\s*[0-9](?:\s*[0-9]){0,2}\s*)\.(\s*[0-9](?:\s*[0-9]){0,2})\s*)\.(\s*[0-9](?:\s*[0-9]){0,2}\s*)\/((?:\s*[0-9]{1,2}))\b

虽然只少了4个字符,但我觉得这样更易读,而不是一直重复可选的字符类。

撰写回答