括号内斜线的元字符

时间:2014-06-08 14:54:09

标签: python regex

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

  

元类中的元字符不活跃。例如,[akm $]会   匹配任何字符'a','k','m'或'$'; '$'通常是一个   元字符,但在一个字符类中它被剥夺了它   特殊性。

但是`

  

(预定义的字符集)可以包含在字符内   类。例如,[\ s,。]是一个与任何匹配的字符类   空白字符,或','或'。'。

所以我想知道如何理解上面两个不同的陈述,似乎对\何时在[]内工作提出了相反的建议?感谢。

2 个答案:

答案 0 :(得分:2)

\只有在定义预定义的字符集时才能在字符类中工作,除非你通过将它加倍来转义元字符。

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

从技术上讲,\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')
[' ', ' ', ' ', ' ', ' ', ' ', ' ']

答案 1 :(得分:1)

  

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

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

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

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