从https://docs.python.org/2/howto/regex.html开始,我了解到反斜杠不是必需的:
元类中的元字符不活跃。例如,[akm $]会 匹配任何字符'a','k','m'或'$'; '$'通常是一个 元字符,但在一个字符类中它被剥夺了它 特殊性。
但是`
(预定义的字符集)可以包含在字符内 类。例如,[\ s,。]是一个与任何匹配的字符类 空白字符,或','或'。'。
所以我想知道如何理解上面两个不同的陈述,似乎对\
何时在[]
内工作提出了相反的建议?感谢。
答案 0 :(得分:2)
\
只有在定义预定义的字符集时才能在字符类中工作,除非你通过将它加倍来转义元字符。 咄。
但是,是的,第一句话太容易掩盖了这一点。
从技术上讲,\s
,\w
等不是元字符。它们是预定义的字符类集,因此定义仍然有效。反斜杠也不是;它定义了转义序列的开始。即使在字符类中,转义转义序列的正确方法是将反斜杠加倍。
请注意,任何未识别的转义序列都会导致re
模式包含一个字符,忽略无效的反斜杠并仅使用下一个字符。 \C
不是已知的字符类,因此该模式在该点包含字符C
。
元字符由转义序列组成,例如\A
,\Z
和\B
;在字符类中使用时,这些只是常规的A
,Z
和B
个字符。 \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]
中,第一个]
失去了它的特殊性。当然,也有不同的方式来争论这一点。 :)