正则表达式
以下是转抄自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(最后一位没匹配上),请教是哪里出问题了? 看不懂你的那个正则表达式,这样不行?
#!/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)
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)
人造人 发表于 2022-5-18 21:04
看不懂你的那个正则表达式,这样不行?
谢谢指教。不好意思我忘了说明一下,IP地址的数字是有要求的,比如每个数字范围是0--255,并且如果前两位是25的话,后面只能是0-5。其实我是想验证地址的合法性 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的
谢谢再帮尽快参琢下 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)
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
人造人 发表于 2022-5-18 22:01
0~ 255 你两个 error 的都超啦 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'>
人造人 发表于 2022-5-18 22:15
print(re.search(pattern, '253.250.240.259'))
我感觉楼主的意思是这个要输出None,而不是
输出结果是192.168.1.25,但我希望是192.168.1.252(最后一位没匹配上),请教是哪里出问题了?
这样也不行
#!/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'))
Twilight6 发表于 2022-5-18 22:19
谢谢指教。不好意思我忘了说明一下,IP地址的数字是有要求的,比如每个数字范围是0--255,并且如果前两位是25的话,后面只能是0-5。其实我是想验证地址的合法性 人造人 发表于 2022-5-18 22:21
这样也不行
不需要那样判断,这样就行了,我只是在研究怎么把楼主的改通:
r'^(?:(?:25|2|??)\.){3}(?:25|2|??)$'
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??? hynet1024 发表于 2022-5-18 22:24
我好像有个重大发现
我昨天测试没问题的,今天打开啥也没动就不行了,刚才经您指导几经折腾成功后,还原 ...
不应该吧,我这里测试也是少一个 2
Twilight6 发表于 2022-5-18 22:26
不应该吧,我这里测试也是少一个 2
终于弄明确了
1、如果不调整顺序,则要去掉一个{0,1}
2、调换一下顺序,则可以保留{0,1}
这???大神能解释不? 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子串
我感觉无法只用正则表达式来做这件事
人造人 发表于 2022-5-18 22:33
这样也不行,看起来楼主的意思是要在一个文本串中找合法的ip子串
我感觉无法只用正则表达式来做这件 ...
可以做到的,我的语句本身没什么大问题。要么调换最后一段规则 | 前后的顺序,要么去年一个{0,1}
只是我非常不解,why???
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'))
人造人 发表于 2022-5-18 22:44
可以?
对呀。第一条输出了没问题,第二条没有完全匹配到,因为最后的259不是有效ip数字,只匹配到了25
页:
[1]
2