繁体   English   中英

re.sub和re.findall之间的区别

[英]Difference between re.sub and re.findall

我的字符串看起来像“Billboard Bill SpA”。 我想要一个删除SpA的正则表达式,但前提是它之前有一个大写的单词。 我使用的正则表达式是“[AZ] [az] * \\ s(SpA)”。 如果我在使用之前使用re.sub和SpA以及大写单词,这是预期的。

re.sub("[A-Z][a-z]*\s(SpA)", "", "Billboard Bill SpA")
'Billboard '

但是,如果我使用re.findall,我会得到我需要的功能:

re.findall("[A-Z][a-z]*\s(SpA)", "Billboard Bill SpA")
['SpA']

我知道我可以用“?<=”编写一个前表达式,它不使用前文本,但只适用于固定长度的表达式。 有人知道我只能用re.sub删除“SpA”,或者让它像re.findall一样工作吗?

为了更清楚,我想要一个正则表达式来删除Spa,但只有在之前有一个大写单词时:

re.sub(regular_expresssion, "", "Billboard Bill SpA") -> Billboard Bill
re.sub(regular_expresssion, "", "to SpA") -> to SpA

您的re.sub正在替换整个匹配,而不仅仅是组(SpA) 这就是为什么它也要删除Bill 另一方面, findall正在给你这个小组。

re.sub您可以指定包含您不想删除的匹配部分。

re.sub("([A-Z][a-z]*\s)SpA", "\\1", "Billboard Bill SpA")
'Billboard Bill '

如果你想删除的空间为好,移动\\s括号之外。

使用组执行替换。

>>> re.sub("([A-Z][a-z]*\s)(SpA)", "\\1", "Billboard Bill SpA")
'Billboard Bill '

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM