即使在空间的情况下,正则表达式匹配IP地址+ CIDR

时间:2014-04-17 11:00:56

标签: python regex python-2.7

我需要一个匹配ips的正则表达式,如192.1.2.33/23,但即使是空格或换行符,例如:

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 个答案:

答案 0 :(得分: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}而不是重复char类

来缩短它
\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个字符,但也更易读IMO,而不是重复可选的字符类。