regex 字边界\b不能在字符类中使用吗?[副本]

wooyq4lh  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(96)

这个问题已经有答案了

How to write word boundary inside character class in python without losing its meaning? I wish to add underscore(_) in definition of word boundary(\b)(1个答案)
13天前关闭
正则表达式HOWTO说特殊序列可以包含在字符类中(强调我的):
下面的特殊序列列表并不完整。有关Unicode字符串模式的序列和扩展类定义的完整列表,请参见标准库参考中正则表达式的最后一部分。通常,Unicode版本匹配Unicode数据库中相应类别中的任何字符。
\d匹配任何十进制数字;这相当于类[0-9]
\D匹配任何非数字字符;这相当于类[^0-9]
\s匹配任何空白字符;这相当于类[ \t\n\r\f\v]
\S匹配任何非空白字符;这相当于类[^ \t\n\r\f\v]
\w匹配任何字母数字字符;这相当于类[a-zA-Z0-9_]
\W匹配任何非字母数字字符;这相当于类[^a-zA-Z0-9_]

这些序列可以包含在字符类中。例如,[\s,.]是一个字符类,将匹配任何空白字符,或',''.'

但是,看起来\b不能用于字符类。

pattern = r'\bcool\b'
text = "cool"

matches = re.finditer(
    pattern=pattern, 
    string=text.strip(), 
    flags=re.IGNORECASE
)
if matches:
    for match in matches:
        print(f"match: {match.group(0): <20} start: {match.start():<5} end: {match.end():<5} pos: {match.endpos:<5}")
---
match: cool                 start: 0     end: 4     pos: 4
pattern = r'[\b\s]cool\b'    # <-----
text = "cool"

matches = re.finditer(
    pattern=pattern, 
    string=text.strip(), 
    flags=re.IGNORECASE
)
if matches:
    for match in matches:
        print(f"match: {match.group(0): <20} start: {match.start():<5} end: {match.end():<5} pos: {match.endpos:<5}")
---
No match

请帮助理解这种行为。\b可以使用吗?因为它在字符类中被视为退格键?那是不是有文件记录

9fkzdhlc

9fkzdhlc1#

在Python字符类中不可能包含单词边界。\b标记 * 可以 * 包含在字符类中,但它表示退格字符,而不是单词边界。因此,下面的正则表达式不能按预期工作:

[\b\s]cool\b

但是,你可以使用一个交替而不是尝试的字符类:

(?:\b|\s)cool\b

相关问题