Python 带lookback的正则表达式拆分丢失后半部分

Python 带lookback的正则表达式拆分丢失后半部分,python,python-3.x,regex,string,split,Python,Python 3.x,Regex,String,Split,我有一个包含许多关键字的字符串。我想将字符串拆分为这些关键字的列表(但保留这些关键字,因为它们标识了以下数据的含义) 以以下字符串为例: test_string = "ªttypmp3pfilfDjTunes/DJ Music/(I've Had) The Time Of My Life.mp3tsng<(I've Had) The Time Of My Lifetart:Bill Medley & Jennifer Warnes" 这是我的示例代码: imp

我有一个包含许多关键字的字符串。我想将字符串拆分为这些关键字的列表(但保留这些关键字,因为它们标识了以下数据的含义)

以以下字符串为例:

test_string = "ªttypmp3pfilfDjTunes/DJ Music/(I've Had) The Time Of My Life.mp3tsng<(I've Had) The Time Of My Lifetart:Bill Medley & Jennifer Warnes"
这是我的示例代码:

import re
regex = r'(?=ttyp).*'

split_test_string = re.split(regex, test_string)
print(f"Results: {split_test_string}")
控制台输出:

Results: ['ª', '']
我尝试过积极的前瞻和积极的回望,但没有运气。我可以只使用文字“ttyp”,但随后我就失去了关键字

如果有任何帮助,我将不胜感激,我已经研究、试验和出错(大部分是出错)几个小时了。

给你:

re.split("(?=ttyp|pfil|tsng|tart)", test_string)
您的无法工作的原因是您按
*
进行了拆分,这意味着您捕获了分隔符之后的所有内容,并将其视为分隔符本身(从而将其抛出)。

来自重新导入拆分
正则表达式='(?:ttyp | pfil | tsng | tart)。*?)(?=ttyp | pfil | tsng | tart |$)

test_string=“ªttypmp3pfilfDjTunes/DJ Music/(我已经拥有了)我一生中最美好的时光。mp3tsng这里是一个基于正则表达式的解决方案,使用
re.findall


test\u string=“ªttypmp3pfilfDjTunes/DJ Music/(我已经拥有了)我一生中最美好的时光。正则表达式非常混乱。所以让我确定我明白了。正则表达式返回的是分隔符,而不是我想要保留的字符串?,因为如果模式的宽度为零,
re.split
将不会捕获任何内容。使用
re.findall
作为解决方法。@TimBiegeleisen抱歉,小伙子,它是有效的。这是rextester中的一个bug。它工作的原因是它在一个零宽度的模式上分裂。@Chaky31正则表达式在每个位置检查将来是否有任何东西与其中一个模式匹配。如果有,它将匹配该位置(零宽度匹配)并拆分。@TimBiegeleisen哦,给你,Tim。这是一个在3.7中解决的错误。Changelog-3.6是如此2016:-p感谢替代解决方案。UTF-8对我来说是不可能的,因为字符串的来源是来自选择mac roman的供应商。和他一起工作有点烦人。但我喜欢将关键字列在列表中的方法。这是一个简洁易读的优点我很好奇为什么在列表理解中使用“匹配”?有必要吗?基于一些首字母测试,这个方法慢了38%,我看到的唯一区别是列表理解和正则表达式。因为我要做一百万次。这很重要。列表理解过滤掉了空字符串,因为我包含了
if x
。否则,列表将在每次匹配之间包含空字符串。
Results: ['ª', '']
re.split("(?=ttyp|pfil|tsng|tart)", test_string)
['\xc2\xaa', 'ttypmp3', "pfilfDjTunes/DJ Music/(I've Had) The Time Of My Life.mp3",
 "tsng<(I've Had) The Time Of My Life", 'tart:Bill Medley & Jennifer Warnes']