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

时间:2014-08-14 08:07:09

标签: python regex

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

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']

我知道我可以用"?< ="写一个预表达式它不会消耗前文本,但仅适用于固定长度的表达式。任何人都知道我能做什么只能删除" SpA"使用re.sub,还是让它像re.findall一样工作?

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

如果您想删除空格,请在括号外移动\s

答案 1 :(得分:1)

使用群组进行替换。

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