[英]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.