hynet1024 发表于 2022-5-18 20:54:38

正则表达式

以下是转抄自Python教程关于正则表达式的语句:


import re

str = 'abc192.168.1.252efg'
ip_add = re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}({0,1}\d{0,1}\d{0,1}|2\d|25)', str)
print(ip_add)

输出结果是192.168.1.25,但我希望是192.168.1.252(最后一位没匹配上),请教是哪里出问题了?

人造人 发表于 2022-5-18 21:04:25

看不懂你的那个正则表达式,这样不行?
#!/usr/bin/env python
#coding=utf-8

import re

str = 'abc192.168.1.252efg'
ip_add = re.search(r'\d{3}\.\d{3}\.\d{1,3}\.\d{1,3}', str)
print(ip_add)

Twilight6 发表于 2022-5-18 21:13:32



re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}({0,1}\d{0,1}\d{0,1}|2\d|25)', str)

删掉红色部分,改成这样:

re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}(2\d|25)', str)

参考代码:

import re

str = 'abc192.168.1.252efg'

ip_add = re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}(2\d|25)', str)
print(ip_add)

hynet1024 发表于 2022-5-18 21:16:49

人造人 发表于 2022-5-18 21:04
看不懂你的那个正则表达式,这样不行?

谢谢指教。不好意思我忘了说明一下,IP地址的数字是有要求的,比如每个数字范围是0--255,并且如果前两位是25的话,后面只能是0-5。其实我是想验证地址的合法性

hynet1024 发表于 2022-5-18 21:41:06

Twilight6 发表于 2022-5-18 21:13
re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}({0,1}\d{0,1}\d{0,1}|2\d|2 ...

如果这样改的话,IP的最后一段就只能是240--255了吧?但实际上也是可以为0--255的
谢谢再帮尽快参琢下

Twilight6 发表于 2022-5-18 21:50:09

hynet1024 发表于 2022-5-18 21:41
如果这样改的话,IP的最后一段就只能是240--255了吧?但实际上也是可以为0--255的
谢谢再帮尽快参琢下



re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}({0,1}\d{0,1}\d{0,1}|2\d|25)', str)

调换红色部分位置到最后,改成这样:

re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}(2\d|25|{0,1}\d{0,1}\d{0,1})', str)

参考代码:

import re

str = 'abc192.168.1.252efg'

ip_add = re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}(2\d|25|{0,1}\d{0,1}\d{0,1})', str)
print(ip_add)

人造人 发表于 2022-5-18 22:01:49

Twilight6 发表于 2022-5-18 21:50
re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}({0,1}\d{0,1}\d{0,1}|2 ...

#!/usr/bin/env python
#coding=utf-8

import re

pattern = r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}(2\d|25|{0,1}\d{0,1}\d{0,1})'
print(re.search(pattern, 'abc192.168.1.152efg'))
print(re.search(pattern, '0.0.0.0'))
print(re.search(pattern, '255.255.255.255'))
print(re.search(pattern, '10.99.100.149'))
print(re.search(pattern, '253.250.240.249'))
print(re.search(pattern, '256.250.240.249'))    # error
print(re.search(pattern, '253.256.240.249'))
print(re.search(pattern, '253.250.240.259'))    # error

Twilight6 发表于 2022-5-18 22:04:16

人造人 发表于 2022-5-18 22:01



0~ 255 你两个 error 的都超啦

人造人 发表于 2022-5-18 22:15:44

Twilight6 发表于 2022-5-18 22:04
0~ 255 你两个 error 的都超啦

print(re.search(pattern, '253.250.240.259'))
我感觉楼主的意思是这个要输出None,而不是
<re.Match object; span=(0, 14), match='253.250.240.25'>

Twilight6 发表于 2022-5-18 22:19:10

人造人 发表于 2022-5-18 22:15
print(re.search(pattern, '253.250.240.259'))
我感觉楼主的意思是这个要输出None,而不是



输出结果是192.168.1.25,但我希望是192.168.1.252(最后一位没匹配上),请教是哪里出问题了?

人造人 发表于 2022-5-18 22:21:15

这样也不行
#!/usr/bin/env python
#coding=utf-8

import re

pattern = r'((25|2\d|1\d{2}|\d{1,2})\.){3}(25|2\d|1\d{2}|\d{1,2})'
print(re.search(pattern, 'abc192.168.1.152efg'))
print(re.search(pattern, '0.0.0.0'))
print(re.search(pattern, '255.255.255.255'))
print(re.search(pattern, '10.99.100.149'))
print(re.search(pattern, '253.250.240.249'))
print(re.search(pattern, '256.250.240.249'))    # error
print(re.search(pattern, '253.256.240.249'))
print(re.search(pattern, '253.250.240.259'))    # error


我感觉用正则表达式无法完成这个任务

简单一点
先用正则表达式匹配一个ip格式的文本,如何再用代码来判断这个ip是不是合法的ip
##!/usr/bin/env python
#coding=utf-8

import re

def search_ip(text):
    result = re.search(r'((\d{1,3})\.){3}(\d{1,3})', text)
    if not result: return None
    for i in result.string.split('.'):
      if int(i) < 0 or int(i) > 255: return None
    return result

print(search_ip('0.0.0.0'))
print(search_ip('255.255.255.255'))
print(search_ip('10.99.100.149'))
print(search_ip('253.250.240.249'))
print(search_ip('256.250.240.249'))
print(search_ip('253.256.240.249'))
print(search_ip('253.250.240.259'))
print(search_ip('abcefg'))

人造人 发表于 2022-5-18 22:23:33

Twilight6 发表于 2022-5-18 22:19


谢谢指教。不好意思我忘了说明一下,IP地址的数字是有要求的,比如每个数字范围是0--255,并且如果前两位是25的话,后面只能是0-5。其实我是想验证地址的合法性

Twilight6 发表于 2022-5-18 22:23:45

人造人 发表于 2022-5-18 22:21
这样也不行






不需要那样判断,这样就行了,我只是在研究怎么把楼主的改通:

r'^(?:(?:25|2|??)\.){3}(?:25|2|??)$'

hynet1024 发表于 2022-5-18 22:24:10

Twilight6 发表于 2022-5-18 21:50
re.search(r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}({0,1}\d{0,1}\d{0,1}|2 ...

我好像有个重大发现
我昨天测试没问题的,今天打开啥也没动就不行了,刚才经您指导几经折腾成功后,还原为最初的样子也没问题了。难道是Python的一个重大bug???

Twilight6 发表于 2022-5-18 22:26:34

hynet1024 发表于 2022-5-18 22:24
我好像有个重大发现
我昨天测试没问题的,今天打开啥也没动就不行了,刚才经您指导几经折腾成功后,还原 ...



不应该吧,我这里测试也是少一个 2

hynet1024 发表于 2022-5-18 22:29:56

Twilight6 发表于 2022-5-18 22:26
不应该吧,我这里测试也是少一个 2

终于弄明确了
1、如果不调整顺序,则要去掉一个{0,1}
2、调换一下顺序,则可以保留{0,1}

这???大神能解释不?

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

Twilight6 发表于 2022-5-18 22:23
不需要那样判断,这样就行了,我只是在研究怎么把楼主的改通:

#!/usr/bin/env python
#coding=utf-8

import re

pattern = r'^(?:(?:25|2|??)\.){3}(?:25|2|??)$'

print(re.search(pattern, 'abc192.168.1.152efg'))

print(re.search(pattern, 'ghlfd0.0.0.0zxcvio'))
print(re.search(pattern, 'jglds255.255.255.255zxcoiv'))
print(re.search(pattern, 'zx,cv10.99.100.149qwerjkl'))
print(re.search(pattern, 'gfdio253.250.240.249zxcoiv'))

print(re.search(pattern, 'asdflk256.250.240.249zcvafd'))
print(re.search(pattern, 'zxcv253.256.240.249adsf'))
print(re.search(pattern, 'abcd253.250.240.259qwer'))



这样也不行,看起来楼主的意思是要在一个文本串中找合法的ip子串
我感觉无法只用正则表达式来做这件事

hynet1024 发表于 2022-5-18 22:39:16

人造人 发表于 2022-5-18 22:33
这样也不行,看起来楼主的意思是要在一个文本串中找合法的ip子串
我感觉无法只用正则表达式来做这件 ...

可以做到的,我的语句本身没什么大问题。要么调换最后一段规则 | 前后的顺序,要么去年一个{0,1}

只是我非常不解,why???

人造人 发表于 2022-5-18 22:44:06

hynet1024 发表于 2022-5-18 22:39
可以做到的,我的语句本身没什么大问题。要么调换最后一段规则 | 前后的顺序,要么去年一个{0,1}

只 ...

可以?
#!/usr/bin/env python
#coding=utf-8

import re

pattern = r'(({0,1}\d{0,1}\d{0,1}|2\d|25)\.){3}(2\d|25|{0,1}\d{0,1}\d{0,1})'
print(re.search(pattern, 'abc192.168.1.255efg'))
print(re.search(pattern, 'abc192.168.1.259efg'))

hynet1024 发表于 2022-5-18 22:48:09

人造人 发表于 2022-5-18 22:44
可以?

对呀。第一条输出了没问题,第二条没有完全匹配到,因为最后的259不是有效ip数字,只匹配到了25
页: [1] 2
查看完整版本: 正则表达式