鱼C论坛

 找回密码
 立即注册
查看: 2324|回复: 3

正则表达式中的修饰符re.L、re.U、re.X分别是怎么使用的?

[复制链接]
发表于 2022-2-13 23:08:46 | 显示全部楼层 |阅读模式

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

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

x
我现在在学正则表达式的相关案例,教程上对正则表达式的修饰符介绍的比较简单,其中re.L 做本地化识别(locale-aware)匹配,re.U: 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B,re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解,可否各提供一个实例帮助我理解一下呀?网上也几乎找不到比较好的案例说明呢~谢谢啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-14 00:07:46 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-14 10:34 编辑

re.L和re.U都是改变 \w、\W、\b、\B的行为的

re.L使\w、\W、\b、\B的匹配依赖于当前语言环境

re.U使\w、\W、\b、\B可以匹配unicode编码的字符

首先\w是匹配可以用于变量命名的字符,\b是匹配单词边界,因为python3默认使用utf-8编码,本就可以用unicode字符作为变量名和单词边界,所以re.U在python3中被废弃,用不用都是一样的效果
example:(re.L我暂时还没有找到合适的应用场景,就先不举例了)
(python2)
>>> import re
>>> re.match(r'\w', '你')                          #  不开启re.U匹配模式,无法匹配unicode字符
>>> re.match(r'\w', '你', re.U)                   #  开启了re.U匹配模式,成功匹配unicode字符
<_sre.SRE_Match object at 0x00000000025E4370> 
>>> re.match(r'\b你好\b', '你好')               #  不开启re.U匹配模式,无法将unicode字符作为单词边界
>>> re.match(r'\b你好\b', '你好', re.U)               #  开启了re.U匹配模式,可以将unicode字符作为单词边界
<_sre.SRE_Match object at 0x00000000025E4578>
>>>
(python3)
>>> import re
>>> re.match(r'\w', '你')                          # 在python3中开不开启re.U匹配模式都可以成功匹配unicode字符
<re.Match object; span=(0, 1), match='你'>            
>>> re.match(r'\w', '你', re.U)
<re.Match object; span=(0, 1), match='你'>
>>> re.match(r'\b你好\b', '你好')             # 在python3中开不开启re.U匹配模式都可以将unicode字符作为单词边界
<re.Match object; span=(0, 2), match='你好'>
>>> re.match(r'\b你好\b', '你好', re.U)
<re.Match object; span=(0, 2), match='你好'>
>>>

re.X 使匹配过程忽略表达式的空白和注释(空白包括空格,制表,换行这些不可见字符),因为正则表达式的空白被忽略,此时需要匹配空白可以用\s
example:
>>> import re
>>> re.match(r'你 好', '你 好')                                #  正则表达式中间有个空格,可以成功匹配带空格的字符串
<re.Match object; span=(0, 3), match='你 好'>
>>> re.match(r'你 好', '你 好', re.X)                        #  开启了re.X模式,此时正则表达式中的空格被忽略,无法成功匹配字符串
>>> re.match(r'你\s好', '你 好', re.X)                       #  此时需要匹配字符串中的空格用\s
<re.Match object; span=(0, 3), match='你 好'>
>>> re.match(r'你好 # 这是一个注释', '你好')           # 正则表达式带注释和空白,此时解释器把注释和空白当成普通字符,自然就无法匹配目标字符串
>>> re.match(r'你好 # 这是一个注释', '你好', re.X)     # 开启了re.X模式,此时注释和空白被忽略,可以成功匹配目标字符串
<re.Match object; span=(0, 2), match='你好'>
>>>

关于re.L,我从网上找了一段话
re.L:使用当地locale。(python中有个locale模块,locale代表不同的语言,地区和字符集)由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配。这个标记只能对byte样式有效。这个标记不推荐使用,因为语言区域机制很不可靠,它一次只能处理一个 "习惯”。

locale模块使用:
>>> import locale
>>> locale.getlocale()
('Chinese (Simplified)_China', '936')
>>>

关于正则表达式比较详细的讲解,你可以看一下这篇文章:https://www.cnblogs.com/yyds/p/6953348.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-2-14 20:35:12 | 显示全部楼层
isdkz 发表于 2022-2-14 00:07
re.L和re.U都是改变 \w、\W、\b、\B的行为的

re.L使\w、\W、\b、\B的匹配依赖于当前语言环境

谢谢你给我介绍的这么详细,这么清楚!但是我还有几个疑问想请教你一下:
1.re.match(r'你好# 这是一个注释 ', '你好') 这个match方法是匹配开头字符,那这个注释在你好之后出现为什么也会导致匹配不上的,还是不太理解啊~
2.re.match(r'你\s好', '你 好')  这个r应该是代表原始字符串吧,那就是说把\s就当成普通的字符,那么怎么会和你(空格)好匹配的上呢?不是应该不加r写成re.match('你\s好', '你 好') 才对嘛?
3.long_string='''
一杯敬朝阳
一杯敬月光
唤醒我的向往
温柔了寒窗
'''
re.search('一杯\w+一杯',long_string)
re.search('一杯\w+一杯',long_string,re.X)
我用这两个写法都没有匹配结果输出,不知道是什么原因?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-14 21:08:15 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-14 21:55 编辑
zzong2019 发表于 2022-2-14 20:35
谢谢你给我介绍的这么详细,这么清楚!但是我还有几个疑问想请教你一下:
1.re.match(r'你好# 这是一个 ...


第一个问题:
match不是匹配开头字符,而是要从头开始匹配,意思是第一个匹配不上也就不再往下匹配了,
除了这点它还是需要完全匹配上正则表达式才可以匹配的,
如果没有忽略注释的话,因为正则表达式中有注释,待匹配字符串中没有,自然就无法匹配上了

第二个问题:
没错,r是原始字符串,不是什么时候都要用的,因为有时候用不用都一样,
只是习惯上最好加上,就是为了不让python字符串的默认转义行为产生让人迷惑的效果,
example:
>>> import re
>>> re.match('你\s好', '你 好')
<re.Match object; span=(0, 3), match='你 好'>
>>> re.match('你\\s好', '你 好')
<re.Match object; span=(0, 3), match='你 好'>
>>>
可以看到,如果你不加上r的话,上面这两个都能匹配得上,
就是因为re.match('你\\s好', '你 好')中python把\\转义成\了,
这样就会让人看了很迷惑,不同的正则表达式却得到了一样的结果,
而如果你加上r的话就不会产生这种很迷的行为

第三个问题:
\w中的w指的是word,我发现它能匹配的字符都是符合变量命名规则的字符,
所以为了方便记忆我就当它是可以匹配用作变量名的所有字符,
因为你的待匹配字符串中有换行,而\w是无法匹配换行的,自然就无法匹配上了
那你可能就会问了re.X不是把换行给忽略了吗?怎么还是匹配不上呢
注意:re.X忽略的是正则表达式中的换行,而不是待匹配字符串的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 06:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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