鱼C论坛

 找回密码
 立即注册
查看: 1773|回复: 16

[已解决]关于正则表达式的匹配问题

[复制链接]
发表于 2020-7-27 01:51:20 | 显示全部楼层 |阅读模式

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

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

x
r'ABC\\001'和r'ABC\001'为什么能匹配,但是反过来却不行?

re.search(r'ABC\\001',r'ABC\001')
最佳答案
2020-7-27 09:00:22
本帖最后由 BIO-张磊 于 2020-7-27 09:16 编辑

re.search(pattern,string)
其中pattern进行了两步转义,而string只进行一步转义,举个例子
re.search('ABC\\001','ABC\\001')
这个你可能认为是完全匹配,其实是错误的,pattern部分的ABC\\001其实变成了ABC\x01(因为这里先ABC\\001转义变成ABC\001再转义变成了ABC\x01),而string部分的ABC\\001是ABC\001(只进行了ABC\001的转义)
所以上面的完全匹配应该是
re.search('ABC\\001','ABC\001')

我们再来看看r这个符号
r符号只是避免了第一次转义,那也就是说re.search的pattern部分的两次转义变成了第一步不进行,直接第二步转义,而string部分的转义就没有了(因为它只有第一步转义)
所以
re.search(r'ABC\\001',r'ABC\\001')#pattern部分的r'ABC\\001'变成ABC\001,而string部分的r'ABC\\001'就是ABC\\001
re.search(r'ABC\001',r'ABC\\001')#pattern部分的r'ABC\001'变成ABC\x01,而string部分的r'ABC\\001'就是ABC\\001
没结果
但是
re.search(r'ABC\\001',r'ABC\001')#其中pattern部分的r'ABC\\001'变成ABC\001,string部分的r'ABC\001'就是ABC\001
可以匹配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-27 08:51:29 | 显示全部楼层
zltzlt 发表于 2020-7-27 08:48
ABC\\001 包含 ABC\001,而 ABC\001 不包含 ABC\\001,这个应该很好理解的

嗯,2楼说的对,ABC\001是不包含ABC\\001,而ABC\\001包含ABC\001
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 08:52:06 | 显示全部楼层
zltzlt 发表于 2020-7-27 08:48
ABC\\001 包含 ABC\001,而 ABC\001 不包含 ABC\\001,这个应该很好理解的

如果帮到你了,设个最佳答案怎么样啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 08:52:22 | 显示全部楼层
陈尚涵 发表于 2020-7-27 08:52
如果帮到你了,设个最佳答案怎么样啊?

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

使用道具 举报

发表于 2020-7-27 08:53:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 08:54:01 | 显示全部楼层

额,回复错了,以为你是楼主了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 08:54:29 | 显示全部楼层
陈尚涵 发表于 2020-7-27 08:54
额,回复错了,以为你是楼主了

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

使用道具 举报

发表于 2020-7-27 08:56:49 | 显示全部楼层

我刚好问你一个问题:勋章怎么得啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 08:57:14 | 显示全部楼层
陈尚涵 发表于 2020-7-27 08:56
我刚好问你一个问题:勋章怎么得啊

https://fishc.com.cn/home.php?mod=medal

符合要求可以直接领取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 08:58:43 | 显示全部楼层
zltzlt 发表于 2020-7-27 08:57
https://fishc.com.cn/home.php?mod=medal

符合要求可以直接领取

这是哪个菜单啊,我找不到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 08:59:25 | 显示全部楼层
陈尚涵 发表于 2020-7-27 08:58
这是哪个菜单啊,我找不到。

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

使用道具 举报

发表于 2020-7-27 09:00:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 BIO-张磊 于 2020-7-27 09:16 编辑

re.search(pattern,string)
其中pattern进行了两步转义,而string只进行一步转义,举个例子
re.search('ABC\\001','ABC\\001')
这个你可能认为是完全匹配,其实是错误的,pattern部分的ABC\\001其实变成了ABC\x01(因为这里先ABC\\001转义变成ABC\001再转义变成了ABC\x01),而string部分的ABC\\001是ABC\001(只进行了ABC\001的转义)
所以上面的完全匹配应该是
re.search('ABC\\001','ABC\001')

我们再来看看r这个符号
r符号只是避免了第一次转义,那也就是说re.search的pattern部分的两次转义变成了第一步不进行,直接第二步转义,而string部分的转义就没有了(因为它只有第一步转义)
所以
re.search(r'ABC\\001',r'ABC\\001')#pattern部分的r'ABC\\001'变成ABC\001,而string部分的r'ABC\\001'就是ABC\\001
re.search(r'ABC\001',r'ABC\\001')#pattern部分的r'ABC\001'变成ABC\x01,而string部分的r'ABC\\001'就是ABC\\001
没结果
但是
re.search(r'ABC\\001',r'ABC\001')#其中pattern部分的r'ABC\\001'变成ABC\001,string部分的r'ABC\001'就是ABC\001
可以匹配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 09:01:00 | 显示全部楼层

哦,那我今天得再发2个帖子,这样.......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 09:19:54 | 显示全部楼层
zltzlt 发表于 2020-7-27 08:57
https://fishc.com.cn/home.php?mod=medal

符合要求可以直接领取

终于把这三个勋章集齐了,可不容易啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 09:24:26 | 显示全部楼层
陈尚涵 发表于 2020-7-27 09:19
终于把这三个勋章集齐了,可不容易啊

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

使用道具 举报

发表于 2020-7-27 09:45:07 | 显示全部楼层
本帖最后由 sunrise085 于 2020-7-27 09:56 编辑
zltzlt 发表于 2020-7-27 08:48
ABC\\001 包含 ABC\001,而 ABC\001 不包含 ABC\\001,这个应该很好理解的


二楼说的好像不对吧??
这不是因为包含问题吧?
re.search(pattern,string)
r'ABC\\001'在pattern中的话,匹配的就是 原始字符串'ABC\001',原始字符串'ABC\001'在python中的写法有两种: r'ABC\001' 和 'ABC\\001'
若r'ABC\001'在pattern中的话,则只能匹配字符串'ABC\001'
你需要知道在python中'\xxx'是什么意思,字符串中出现一个反斜杠后面跟着少于三位数的小于8的数字,说明这是一个8进制的ASCII码,若出现在pattern中则需要是0开头的小于8的数字,0后面最多三位小于8的数字
你可以试试:re.search(r'abc\012','abc\n')    re.search(r'abc\060','abc0')

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-7-27 09:48:47 | 显示全部楼层
sunrise085 发表于 2020-7-27 09:45
二楼说的好像不对吧??
这不是因为包含问题吧?
re.search(pattern,string)

差点误人子弟了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 17:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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