鱼C论坛

 找回密码
 立即注册
查看: 2507|回复: 26

[已解决]正则表达式

[复制链接]
发表于 2022-5-18 20:54:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


import re

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

输出结果是192.168.1.25,但我希望是192.168.1.252(最后一位没匹配上),请教是哪里出问题了?
最佳答案
2022-5-18 22:23:45




不需要那样判断,这样就行了,我只是在研究怎么把楼主的改通:
r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 21:13:32 | 显示全部楼层


re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])', str)

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

re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}(2[0-4]\d|25[0-5])', str)

参考代码:
import re

str = 'abc192.168.1.252efg'

ip_add = re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}(2[0-4]\d|25[0-5])', str)
print(ip_add)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-18 21:16:49 | 显示全部楼层
人造人 发表于 2022-5-18 21:04
看不懂你的那个正则表达式,这样不行?

谢谢指教。不好意思我忘了说明一下,IP地址的数字是有要求的,比如每个数字范围是0--255,并且如果前两位是25的话,后面只能是0-5。其实我是想验证地址的合法性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-18 21:41:06 | 显示全部楼层
Twilight6 发表于 2022-5-18 21:13
re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|2 ...

如果这样改的话,IP的最后一段就只能是240--255了吧?但实际上也是可以为0--255的
谢谢再帮尽快参琢下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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




re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])', str)

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

re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}(2[0-4]\d|25[0-5]|[01]{0,1}\d{0,1}\d{0,1})', str)

参考代码:
import re

str = 'abc192.168.1.252efg'

ip_add = re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}(2[0-4]\d|25[0-5]|[01]{0,1}\d{0,1}\d{0,1})', str)
print(ip_add)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 22:01:49 | 显示全部楼层
Twilight6 发表于 2022-5-18 21:50
re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d{0,1}|2[0-4] ...
#!/usr/bin/env python
#coding=utf-8

import re

pattern = r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}(2[0-4]\d|25[0-5]|[01]{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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 22:04:16 | 显示全部楼层


0~ 255 你两个 error 的都超啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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(最后一位没匹配上),请教是哪里出问题了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 22:21:15 | 显示全部楼层
这样也不行
#!/usr/bin/env python
#coding=utf-8

import re

pattern = r'((25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})\.){3}(25[0-5]|2[0-4]\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'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 22:23:33 | 显示全部楼层
谢谢指教。不好意思我忘了说明一下,IP地址的数字是有要求的,比如每个数字范围是0--255,并且如果前两位是25的话,后面只能是0-5。其实我是想验证地址的合法性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 22:23:45 | 显示全部楼层    本楼为最佳答案   




不需要那样判断,这样就行了,我只是在研究怎么把楼主的改通:
r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-18 22:24:10 | 显示全部楼层
Twilight6 发表于 2022-5-18 21:50
re.search(r'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d{0,1}|2[0-4] ...

我好像有个重大发现
我昨天测试没问题的,今天打开啥也没动就不行了,刚才经您指导几经折腾成功后,还原为最初的样子也没问题了。难道是Python的一个重大bug???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-18 22:29:56 | 显示全部楼层
Twilight6 发表于 2022-5-18 22:26
不应该吧,我这里测试也是少一个 2

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

这???大神能解释不?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 22:33:20 | 显示全部楼层
Twilight6 发表于 2022-5-18 22:23
不需要那样判断,这样就行了,我只是在研究怎么把楼主的改通:
#!/usr/bin/env python
#coding=utf-8

import re

pattern = r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'

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子串
我感觉无法只用正则表达式来做这件事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

只是我非常不解,why???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'(([01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])\.){3}(2[0-4]\d|25[0-5]|[01]{0,1}\d{0,1}\d{0,1})'
print(re.search(pattern, 'abc192.168.1.255efg'))
print(re.search(pattern, 'abc192.168.1.259efg'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-18 22:48:09 | 显示全部楼层


对呀。第一条输出了没问题,第二条没有完全匹配到,因为最后的259不是有效ip数字,只匹配到了25
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 05:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表