【问题标题】:metacharacters with slash inside brackets括号内带有斜线的元字符
【发布时间】:2014-06-08 14:54:08
【问题描述】:

https://docs.python.org/2/howto/regex.html了解到,反斜杠不是必须的:

元字符在类中不活跃。例如,[akm$] 将 匹配任何字符“a”、“k”、“m”或“$”; '$' 通常是 元字符,但在字符类中它被剥离了 特殊性。

但是`

(预定义的字符集)可以包含在字符内 班级。例如,[\s,.] 是一个字符类,它将匹配任何 空白字符,或“,”或“.”。

所以我想知道如何理解上述两个不同的陈述,这似乎给出了关于\ 何时在[] 中工作的相反建议?谢谢。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    \ 仅在定义了预定义字符集的字符类中才能工作,除非您通过加倍将其转义为元字符。

    但是,是的,第一句话太容易掩盖了这一点。

    从技术上讲,\s\w 等不是元字符。它们是预定义的字符类集,所以定义仍然成立。反斜杠也不是;它定义了转义序列的开始。即使在字符类中,转义转义序列的正确方法也是双反斜杠。

    请注意,任何无法识别的转义序列都会导致re 模式包含一个字符,无效的反斜杠将被忽略,仅使用下一个字符。 \C 不是已知的字符类,因此该模式在此时包含字符 C

    有些元字符确实由转义序列组成,例如\A\Z\B;在字符类中使用时,这些只是常规的AZB 字符。 \b 很特别;在字符类中,它是一个退格字符,就像在 Python 字符串文字中一样(类似于 \n\t\r\a\v 的解释方式与字符串文字中的相同)。

    演示:

    >>> import re
    >>> re.findall(r'[\\]', r'\ the backslash will match')
    ['\\']
    >>> re.findall(r'[\C]', r'\C is not a valid escape sequence, only Cs will match')
    ['C', 'C']
    >>> re.findall(r'[\s]', r'No s will match, whitespace is matched instead')
    [' ', ' ', ' ', ' ', ' ', ' ', ' ']
    

    【讨论】:

    • 你的意思是“\将在一个字符类中工作只有当它定义了一个预定义的字符集”?
    • @Tim:我想我得到了最终版本。对此感到抱歉。
    • 请注意,在涉及反斜杠字母序列时,Python 过于宽松。例如,\C 应该生成错误消息,无论它是否在字符类中。一般规则是,标点符号始终可以转义,无论它们是否为元字符。但是反斜杠字母序列必须形成一个有效的转义序列,无论它出现在哪里。大多数其他正则表达式风格都遵循这些规则。
    • 谢谢。 @MartijnPieters。 “有些元字符确实由转义序列组成,例如 \A、\Z、\b 和 \B;在字符类中使用时,这些只是常规的 A、Z、b 和 B 字符。”我发现[]里面\b是退格,而其他三个是字面量。那么为什么会有差异呢?
    • @Tim:啊,确实。在 Python 字符串中,\b 是一个退格,re 支持这样的转义序列。我忘了那个。
    【解决方案2】:

    所以我想知道如何理解上述两个不同的陈述

    以下是我对这些陈述(以及文档中任何两个看似矛盾的陈述)的理解:

    Never assume that documentation writers have perfect logic.
    (Unlike the creatures of logic puzzles.)
    

    例如,单个 \ 是否应该被视为元字符(我同意你的观点),这里是 Python 字符类中不是 stripped of its special nature 的另一个字符示例:@ 987654324@。在[abc]] 中,第一个] 并没有失去它的特殊性。它关闭了字符类。事实上,最终的] 已经失去了它的特殊性,因为它在字符类之外,但现在匹配文字]。另一方面,在[]abc] 中,第一个] 已经失去了它的特殊性。当然,也有不同的方式来争论这一点。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 2022-11-18
      • 2013-02-12
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多