在 Python 中用正则表达式替换
Posted
技术标签:
【中文标题】在 Python 中用正则表达式替换【英文标题】:Substitution by regular expression in Python 【发布时间】:2017-12-20 23:41:21 【问题描述】:考虑 Python sn-p:
import re
str = 'that that kitty is cute'
# Anchor at beginning of string
rgexp_start = r'^(.*) \1'
print(re.sub(rgexp_start, r'\1', str))
# Do NOT anchor at beginning of string
rgexp = r'(.*) \1'
print(re.sub(rgexp, r'\1', str))
打印出来:
that kitty is cute
thatkittyiscute
为什么第二个正则表达式会删除所有空格?作为一个附加问题,请考虑 javascript sn-p:
var str = 'that that kitty is cute';
var rgexp_start = /^(.*) \1/;
alert(str.replace(rgexp_start, '$1'));
var rgexp = /(.*) \1/;
alert(str.replace(rgexp, '$1'));
给出两次:
that kitty is cute
为什么 JavaScript 在处理相同的正则表达式方面与 Python 不同?
【问题讨论】:
【参考方案1】:为了回答您的第一个问题,re.sub
将完全替换您通过的模式。
所以,r'^(.*) \1'
的意思是,替换所有 从头开始的重复项。既然你指定了匹配从头开始,而且字符串只有一个开头,那么唯一能找到匹配替换的就是'^that that'
,这样就完成了。
In[]: 'that that kitty is cute'
'^that that' -> 'that'
Out[]: 'that kitty is cute'
在r'(.*) \1'
的情况下,.*
实际上可以匹配0 个或多个字符。这很重要,因为现在正则表达式不再绑定到开头。所以它的作用是,除了'^that that
'(第一个正则表达式也这样做)之外,它匹配''
,然后是空格,然后再次匹配''
,总共3次。因此,它将用''
替换' '
(两边都有''
(空字符串)的空格)。
In[]: 'that that kitty is cute'
'that that' -> 'that'
' ' -> ''
' ' -> ''
' ' -> ''
Out[]: 'thatkittyiscute'
回答你的第二个问题,b/w python和JS的区别,正如anubhava所解释的那样,JS中的全局标志默认情况下是不启用的;只有第一个替换发生,其余的字符串保持不变。
【讨论】:
【参考方案2】:Javascript 行为不同,因为您没有在 Javascript 正则表达式中打开 global
或 g
标志(在 python 中默认打开)。
如果您使用与g
标志相同的正则表达式:
var rgexp = /(.*) \1/g;
console.log(str.replace(rgexp, '$1'));
然后它会打印:
thatkittyiscute
与python
的行为相同。
顺便说一句,如果你使用这个稍微不同的正则表达式:
(\S+) \1
然后它总是会在替换后打印这个,即使没有锚,就像你的第一个例子一样:
that kitty is cute
\S+
匹配一个或多个非空白字符。
【讨论】:
以上答案都很有启发性。全部关闭:print(re.sub(r'(\S+) \1', r'\1', 'that that kitty is cute and the the puppy is playful'))
打印:that kitty is cute and the puppy is playful
。正则表达式(\S+) \1
可以说是在支持正则表达式的文本编辑器中定位重复单词的最简单途径。
可惜不能勾选2个答案。我建议阅读 anubhava 和 COLDSPEED 的答案,两者都非常相关。以上是关于在 Python 中用正则表达式替换的主要内容,如果未能解决你的问题,请参考以下文章