Python re.sub和re.findall之间的差异

Python re.sub和re.findall之间的差异,python,regex,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(S

我的琴弦看起来像“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']

我知道我可以用“?编写预表达式,使用组执行替换

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

您的
re.sub
正在替换整个匹配项,而不仅仅是组
(SpA)
。这就是为什么它还删除了
账单
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 '