Python 替换文本中最后出现的字符串
假设我有一段文字:Python 替换文本中最后出现的字符串,python,regex,string,replace,Python,Regex,String,Replace,假设我有一段文字: Saturday and Sunday and Monday and Tuesday and Wednesday and Thursday and Friday are days of the week. 我希望除最后一个和之外的所有内容都替换为逗号: Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday and Friday are days of the week. 在正则表达式中有没有一种简单的方法可以做
Saturday and Sunday and Monday and Tuesday and Wednesday and Thursday and Friday are days of the week.
我希望除最后一个和之外的所有内容都替换为逗号:
Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday and Friday are days of the week.
在正则表达式中有没有一种简单的方法可以做到这一点?据我所知,regex中的replace
方法始终替换字符串 方法有一个count
参数:
str.replace(旧的,新的[,计数])
返回一个字符串的副本,其中所有出现的子字符串old都替换为new。如果给定了可选参数计数,则仅替换第一次出现的计数
然后,使用检查字符串中有多少和
,然后检查-1
(因为您需要最后一个和
):
str.count(sub[,start[,end]])
返回子字符串sub在[开始,结束]
范围内不重叠的出现次数。可选参数start和end解释为切片表示法
演示:
如果您想要一个正则表达式解决方案,您可以匹配所有的和
s,后面是字符串中的另一个
>>> str='Monday and Tuesday and Wednesday and Thursday and Friday and Saturday and Sunday are the days of the week.'
>>> import re
>>> re.sub(' and (?=.* and )', ', ', str)
'Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday are the days of the week.'
(?=
…)
是一种前瞻,它确保字符串后面有匹配项,而不包括在实际匹配项中(因此也不包括在替换项中)。这有点像匹配条件。我明白了,不使用牛津逗号。严格来说,正则表达式只进行匹配,替换是宿主语言的一个功能,通常是它的字符串处理功能。这有点不可读。也许你可以用它来自娱自乐。“.join(如果len(x)=0,则减少λx,y:x+[”和“+y]”,否则x+[”,“+y],重新拆分(“and”,“星期六、星期日、星期一、星期二、星期三、星期四和星期五是一周中的几天。”)[::-1],[:-1])[1:]这个字符串将发生什么变化:“星期一、星期二、星期三、星期四、星期五、星期六、星期日是一周中的几天,现在是星期一。”
?这很容易找到,不是吗?可能将“前瞻”中的*
更改为[^.?!]*
,使其永远不允许与过去的句子标点匹配。但是,如何处理句号不是句子结束符的句间缩略语呢?你很快就会以失败告终。除了简单的标记之外,正则表达式可能不是一个合适的工具。但是对于这个简单的问题,您可能会进一步限制它,并且希望它永远不会超过动词。“约翰、玛丽和我去白金汉宫喝了一杯啤酒。”作为一种解决办法(在某些情况下可能也会失败),你可以限制每次出现和之间的字数,即:”和(?=(?:[^,?!]+){1,4}和)
@Mariano John和John的二表妹丈夫的狗和我。。。?实际上,对于有限的范围来说,这是一个非常好的主意,但是你不能解决正则表达式的一般问题。
>>> str='Monday and Tuesday and Wednesday and Thursday and Friday and Saturday and Sunday are the days of the week.'
>>> import re
>>> re.sub(' and (?=.* and )', ', ', str)
'Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday are the days of the week.'