我对Python中的正则表达式有疑问。我试图打印出re.split('(\ d)','SPL5IT THE WORDS')和re.split('\ d','SPL5IT THE WORDS')的结果。结果是这样的:
Cannot find name 'RestoProfile'
为什么第二个返回分隔符,而第一个不返回分隔符?
答案 0 :(得分:4)
因为这就是文档的前两行中的it's documented to do(强调):
通过
string
的出现来拆分pattern
。 如果pattern
中使用了捕获括号,则模式中所有组的文本也会作为结果列表的一部分返回。
该功能本身的“原因”是有时您想要知道捕获的内容,尤其是在使用可以匹配各种事物的更复杂的模式时,您可能需要进行调整您的代码取决于拆分顺序。
对于最简单的示例,如果您想对句子中的某些单词进行变异(以足够复杂的方式(使re.sub
成为不合理的选择),则可以完全照原样重建句子,但是使用新单词,在不按字母顺序排列的字母或空格的情况下进行拆分,而没有捕获,将无法重建原始句子的形式;即使不更改任何单词,也可以在空白行上使用简单的str.split
并假设它是单个空格,' '.join('a\tb\nc d\re'.split())
将会返回'a b c d e'
;在没有捕获的情况下拆分的那一刻,您丢失了数据。相比之下,''.join(re.split(r'(\s+)', 'a\tb\nc d\re'))
是无损的。
如果您需要分组而不捕获,请使用(?:PAT)
形式的非捕获组,而不要捕获(PAT)
。