人造人 发表于 2022-5-18 22:52:53

hynet1024 发表于 2022-5-18 22:48
对呀。第一条输出了没问题,第二条没有完全匹配到,因为最后的259不是有效ip数字,只匹配到了25

问题是 192.168.1.259 这个不是一个有效的ip
这个 print(re.search(pattern, 'abc192.168.1.259efg')) 不应该输出None吗?
我感觉这个程序应该把 192.168.1.259 认为是一个无效的ip,而不应该把 192.168.1.25 认为是一个有效的ip

人造人 发表于 2022-5-18 22:56:20

259是一个整体,你不能匹配到25,然后说这是一个有效的ip
你应该匹配到259,然后认为这是一个无效的ip

hynet1024 发表于 2022-5-18 22:58:21

如果把后面的代码改为   {3}(\d{0,1}\d{0,1}|2\d|25) 就会输出 Nono

奇怪吧???这里面大有文章啊

hynet1024 发表于 2022-5-18 23:02:32

def ip(ip_add):
    tmp = re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}(\d{0,1}\d{0,1}|2\d|25)',ip_add)
    print('Yes,', ip_add, '是一个合规的IP地址') if ip_add in str(tmp) else print('No,',ip_add, '不是一个合规的IP地址')
   
ip('255.0.0.259')

我本来是想做成这样一个东东,没想到引出这么多疑问

人造人 发表于 2022-5-18 23:08:02

hynet1024 发表于 2022-5-18 23:02
def ip(ip_add):
    tmp = re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}(\d{0,1} ...

那就这样
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=213571&pid=5841858

Twilight6 发表于 2022-5-19 07:49:18

hynet1024 发表于 2022-5-18 22:29
终于弄明确了
1、如果不调整顺序,则要去掉一个{0,1}
2、调换一下顺序,则可以保留{0,1}



因为如果不改变顺序,先匹配 {0,1}\d{0,1}\d{0,1} 时,第一个可以匹配 0 次,那么就只需要匹配后两个数就可满足,后续的就不匹配了直接返回

改变顺序后,先匹配 2 开头的,如果2 开头的不匹配才开始匹配 1、0 开头的,这样就保证了先匹配到更大的,再匹配到小范围的

另外去掉 {0,1} 还是无法正确匹配,如果最后一位小于 100 ,那么也会导致匹配不到,所以还是调换下位置比较何时

hynet1024 发表于 2022-5-20 10:43:54

多谢指点!
页: 1 [2]
查看完整版本: 正则表达式