Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换文本中最后出现的字符串_Python_Regex_String_Replace - Fatal编程技术网

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