我一直在尝试使用正则表达式删除字符串的一部分。
Heroes Chapter 91 - Rescue
我需要删除" Chapter -number - "之后的所有内容,我无法删除" - "之后的所有内容。因为我不确定这个头衔是否总会成为"英雄"因此,如果标题是" -New- Spiderman",它将删除错误的部分。与#34; - "相同,如果它删除" - "之后的所有内容,它可能会删除错误的部分。它必须是" Chapter -number - "。我不知道我是否解释得很好。
但是,我尝试过这样做:
title = "Heroes Chapter 91 - Rescue"
title = re.sub('Chapter \d+ (\D+)', '', title)
但它会返回Heroes
。
title = "Heroes Chapter 91 - Rescue"
title = re.sub('Chapter (\d+).*', '', title)
但又返回Heroes
。
有什么想法吗?
PD:有人将我与this question联系起来,但我无法在那里找到解决方案,如果有人看到了,请指出。我显然不是专家:)最终解决方案:
title = "Heroes Chapter 91 - Rescue"
title = re.sub('(Chapter \d+).*', '\\1', title)
答案 0 :(得分:3)
您可以在此处使用捕获组( )
,并在替换中引用捕获的组。
>>> re.sub('(Chapter \d+).*', '\\1', title)
'Heroes Chapter 91'
答案 1 :(得分:1)
当然会的。 re.sub
替换整个字符串中匹配的部分。匹配的部分是“Chapter 91 - Rescue”,因为它完全匹配模式'Chapter(\ d +)(\ D +)',然后你用''完全替换它,所以它被删除了。唯一无与伦比的部分是“英雄”。
您可以再次匹配所有内容,但不是返回'',而是可以返回匹配字符串的一部分:
re.sub('(Chapter \d+).*', '\\1', title)
有了这个,你只保留parens之间的子模式,丢弃其余部分。你将保留“英雄第91章”的模式,其中'英雄'不匹配,但'第91章 - 救援',以。*结尾(贪婪的明星运营商匹配'直到任何非线性结束 - 字符列表)为章后的部分。数。从该匹配开始,仅保留“第91章”,因为它匹配第一个子模式(parens中唯一的子模式),并且只有该子模式获取并替换原始部分。这就是你如何保持'英雄'+'第91章'(丢弃尾随部分 - 实际标题)
答案 2 :(得分:1)
尝试
title = re.sub('(Chapter \d+) .*', '\1', title)
答案 3 :(得分:1)
尝试使用 lookbehind :
re.sub('(?<=Chapter \d+) - .*', '', title)
如果re不支持lookbehind中的量词,请使用cheshircat的解决方案。