鱼C论坛

 找回密码
 立即注册
查看: 1776|回复: 4

[已解决]关于贴子“Python3 如何优雅的使用正则表达式”中元字符“\b”存在有疑问,求解惑

[复制链接]
发表于 2023-8-3 11:02:30 | 显示全部楼层 |阅读模式
5鱼币
下面这段复制于贴子“[库/模块档案] Python3 如何优雅的使用正则表达式  ”
————————————————————————————————————————————————————————————————————————————————————————————————————————————
\b

单词边界,这是一个只匹配单词的开始和结尾的零宽断言。“单词”定义为一个字母数字的序列,所以单词的结束指的是空格或者非字母数字的字符。

下边例子中,class 只有在出现一个完整的单词 class 时才匹配;如果出现在别的单词中,并不会匹配。
>>> p = re.compile(r'\bclass\b')
>>> print(p.search('no class at all'))  
<_sre.SRE_Match object; span=(3, 8), match='class'>
>>> print(p.search('the declassified algorithm'))
None
>>> print(p.search('one subclass is'))
None
复制代码

在使用这些特殊的序列的时候,有两点是需要注意的:第一点需要注意的是,Python 的字符串跟正则表达式在有些字符上是有冲突的(回忆之前反斜杠的例子)。比如说在 Python 中,\b 表示的是退格符(ASCII 码值是 8)。所以,你如果不使用原始字符串,Python 会将 \b 转换成退格符处理,这样就肯定跟你的预期不一样了。

下边的例子中,我们故意不写表示原始字符串的 'r',结果确实大相庭径:
>>> p = re.compile('\bclass\b')
>>> print(p.search('no class at all'))
None
>>> print(p.search('\b' + 'class' + '\b'))  
<_sre.SRE_Match object; span=(0, 7), match='\x08class\x08'>
复制代码

第二点需要注意的是,在字符类中不能使用这个断言。跟 Python 一样,在字符类中,\b 只是用来表示退格符。
__________________________________________________________________________________________________________________________________


一、这里说的“第二点需要注意的”不是很明白,这第二点需要注意说的内容,是不是和第一点重复了?
二、还有这个“字符类”和“字符串”有差别吗?
最佳答案
2023-8-3 11:02:31
第一点需要注意的是,Python 的字符串跟正则表达式在有些字符上是有冲突的,比如在Python中, \b  表示退格符(ASCII码值为8)。因此,如果你不使用原始字符串(以 r 为前缀),Python会将  \b  转换成退格符处理,这可能与你的预期不一致。

在第一个例子中, \b  被正确地用作单词边界,因为使用了原始字符串  r'\bclass\b' 。
import re
p = re.compile(r'\bclass\b')
print(p.search('no class at all'))

然而,在下一个例子中, \b  被解释为退格字符,因为没有使用原始字符串,导致匹配失败:
p = re.compile('\bclass\b')
print(p.search('no class at all'))
print(p.search('\b' + 'class' + '\b'))

第二点需要注意的是, \b  在字符类中不能用作单词边界。在字符类内部, \b  只是表示退格符,而不再具有单词边界的特殊含义。

关于你的问题:
1. 是的,第一点和第二点的内容存在一定的重复,都涉及到了在不同上下文中处理  \b  的问题,但是它们强调的是不同的方面。第一点是关于字符串内部的处理,第二点是关于字符类内部的处理。
2. "字符类" 和 "字符串" 在这里确实有差别。在正则表达式中,字符类是用方括号  []  包围的字符集合,例如  [a-z]  表示匹配任意小写字母。而字符串是指正则表达式要匹配的具体文本内容。在字符类内部,特殊字符如  \b  会失去其特殊含义,而在字符串中, \b  可以用于表示单词边界。

最佳答案

查看完整内容

第一点需要注意的是,Python 的字符串跟正则表达式在有些字符上是有冲突的,比如在Python中, \b 表示退格符(ASCII码值为8)。因此,如果你不使用原始字符串(以 r 为前缀),Python会将 \b 转换成退格符处理,这可能与你的预期不一致。 在第一个例子中, \b 被正确地用作单词边界,因为使用了原始字符串 r'\bclass\b' 。 然而,在下一个例子中, \b 被解释为退格字符,因为没有使用原始字符串,导致匹配失败: ...

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2023-8-3 11:02:31 | 显示全部楼层    本楼为最佳答案   
第一点需要注意的是,Python 的字符串跟正则表达式在有些字符上是有冲突的,比如在Python中, \b  表示退格符(ASCII码值为8)。因此,如果你不使用原始字符串(以 r 为前缀),Python会将  \b  转换成退格符处理,这可能与你的预期不一致。

在第一个例子中, \b  被正确地用作单词边界,因为使用了原始字符串  r'\bclass\b' 。
import re
p = re.compile(r'\bclass\b')
print(p.search('no class at all'))

然而,在下一个例子中, \b  被解释为退格字符,因为没有使用原始字符串,导致匹配失败:
p = re.compile('\bclass\b')
print(p.search('no class at all'))
print(p.search('\b' + 'class' + '\b'))

第二点需要注意的是, \b  在字符类中不能用作单词边界。在字符类内部, \b  只是表示退格符,而不再具有单词边界的特殊含义。

关于你的问题:
1. 是的,第一点和第二点的内容存在一定的重复,都涉及到了在不同上下文中处理  \b  的问题,但是它们强调的是不同的方面。第一点是关于字符串内部的处理,第二点是关于字符类内部的处理。
2. "字符类" 和 "字符串" 在这里确实有差别。在正则表达式中,字符类是用方括号  []  包围的字符集合,例如  [a-z]  表示匹配任意小写字母。而字符串是指正则表达式要匹配的具体文本内容。在字符类内部,特殊字符如  \b  会失去其特殊含义,而在字符串中, \b  可以用于表示单词边界。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-3 11:02:43 | 显示全部楼层
第一点需要注意:
在使用特殊序列时,需要注意Python字符串和正则表达式在某些字符上的冲突。举个例子,在Python中,"\b"表示退格符(ASCII码值为8)。因此,如果不使用原始字符串,Python会将"\b"转换为退格符进行处理,与预期结果不符。
p = re.compile('\bclass\b')print(p.search('no class at all'))  # 输出 Noneprint(p.search('\b' + 'class' + '\b'))  # 输出 <_sre.SRE_Match object; span=(0, 7), match='\x08class\x08'>
第二点需要注意:
在字符类中,不能使用单词边界断言(\b)。正如前面提到的,\b只能用于表示退格符。所以在字符类中,\b失去了特殊的含义,仅表示退格符。

字符类指的是用方括号括起来的一组字符。例如,[abc]表示匹配字符'a'、'b'或'c'中的任意一个。

希望这样回答能够满足你的需求。如果你还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-3 11:24:17 | 显示全部楼层
Mike_python小 发表于 2023-8-3 11:02
第一点需要注意:
在使用特殊序列时,需要注意Python字符串和正则表达式在某些字符上的冲突。举个例子,在P ...

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

使用道具 举报

发表于 2023-8-3 11:25:48 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 21:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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