正则匹配带空格的IP地址+CIDR
我需要一个正则表达式,可以匹配像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个字符,但我觉得这样更易读,而不是一直重复可选的字符类。