我的字符串看起来像" 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
答案 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 '