为什么在python正则表达式中,re.split(';(\d)';';split单词';)的输出与re.split(';\d';';split单词';)的输出不同?
我有一个关于Python中正则表达式的问题。我已尝试打印出re.split(“(\d)”,“SPL5IT the WORDS”)和re.split(“\d”,“SPL5IT the WORDS”)的结果。结果如下:为什么在python正则表达式中,re.split(';(\d)';';split单词';)的输出与re.split(';\d';';split单词';)的输出不同?,python,regex,split,Python,Regex,Split,我有一个关于Python中正则表达式的问题。我已尝试打印出re.split(“(\d)”,“SPL5IT the WORDS”)和re.split(“\d”,“SPL5IT the WORDS”)的结果。结果如下: re.split('\d', 'SPL5IT THE WORDS') Out[20]: ['SPL', 'IT THE WORDS'] re.split('(\d)', 'SPL5IT THE WORDS') Out[21]: ['SPL', '5', 'IT THE WORDS'
re.split('\d', 'SPL5IT THE WORDS')
Out[20]: ['SPL', 'IT THE WORDS']
re.split('(\d)', 'SPL5IT THE WORDS')
Out[21]: ['SPL', '5', 'IT THE WORDS']
为什么第二个会返回分隔符,而第一个不会返回分隔符?因为这是文档前两行中的内容(重点添加):
按出现的模式拆分字符串
。如果捕获括号用于模式
,则模式中所有组的文本也将作为结果列表的一部分返回
该特性本身的“原因”是,有时您想知道捕获了什么,特别是在使用更复杂的模式时,该模式可以匹配所有类型的内容,并且您可能需要根据拆分序列调整代码
举个最简单的例子,如果你想对句子中的某些单词进行变异(以一种足够复杂的方式,使得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)
,我删除了重复状态,因为虽然我想知道如何做某事,但这个人已经知道,并询问它为什么会这样做。我不知道为什么这是一个特别有用的问题,但它不是重复的。@ShadowRanger至少,回答这个问题表明你觉得它很有用。@TylerH:呃。或者这只是意味着我很无聊,不介意玩链接猴子来链接文档。@TylerH:我认为回答为什么这个功能存在(不仅仅是为什么它会这样),至少是一件有用的事情,所以我更新了。