代码之家  ›  专栏  ›  技术社区  ›  mon

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

  •  -2
  • mon  · 技术社区  · 3 年前

    Regular Expression 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 例如,在字符类中被视为退格?那么它是在某个地方记录的吗?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Tim Biegeleisen    3 年前

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

    [\b\s]cool\b
    

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

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