为什么re.split('(\ d)','SPL5IT THE WORDS')的输出与re.split('\ d','SPL5IT THE WORDS')在python中的正则表达式不同?

时间:2018-10-17 01:03:21

标签: python regex split

我对Python中的正则表达式有疑问。我试图打印出re.split('(\ d)','SPL5IT THE WORDS')和re.split('\ d','SPL5IT THE WORDS')的结果。结果是这样的:

Cannot find name 'RestoProfile'

为什么第二个返回分隔符,而第一个不返回分隔符?

1 个答案:

答案 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)