我试图用其他东西替换单个$
个字符,并且想要忽略连续的多个$
个字符,我不能完全弄明白。我试着用前瞻:用python regexp替换一个字符的单个实例
s='$a $$b $$$c $d'
re.sub('\$(?!\$)','z',s)
这给了我:
'za $zb $$zc zd'
当我要的是
'za $$b $$$c zd'
我在做什么错?
我试图用其他东西替换单个$
个字符,并且想要忽略连续的多个$
个字符,我不能完全弄明白。我试着用前瞻:用python regexp替换一个字符的单个实例
s='$a $$b $$$c $d'
re.sub('\$(?!\$)','z',s)
这给了我:
'za $zb $$zc zd'
当我要的是
'za $$b $$$c zd'
我在做什么错?
笔记,如果不使用可调用的替换功能:
$
$
不是优雅,但,这是非常具有可读性:
>>> def dollar_repl(matchobj):
... val = matchobj.group(0)
... if val == '$':
... val = 'z'
... return val
...
>>> import re
>>> s = '$a $$b $$$c $d'
>>> re.sub('\$+', dollar_repl, s)
'za $$b $$$c zd'
嗯。看起来,如果我同时使用了前视和后视,我可以实现它。但似乎应该有一个更简单的方法。
>>> re.sub('(?<!\$)\$(?!\$)','z',s)
'za $$b $$$c zd'
好,无环视并没有回调函数:
re.sub('(^|[^$])\$([^$]|$)', '\1z\2', s)
另一种与re.split
:
''.join('z' if x == '$' else x for x in re.split('(\$+)', s))
仍然是最短的方式来完成任务+1。 – dnozay