2

我正在尝试$用其他字符替换单个字符,并且想$连续忽略多个字符,但我不太清楚如何。我尝试使用前瞻:

s='$a $$b $$$c $d'
re.sub('\$(?!\$)','z',s)

这给了我:

'za $zb $$zc zd'

当我想要的是

'za $$b $$$c zd'

我究竟做错了什么?

4

4 回答 4

3

注意,如果不使用可调用的替换函数:

  • 你需要前瞻,因为如果后面跟着你就不能匹配$
  • 你需要look-behind,因为如果前面有你不能匹配$

不那么优雅,但这是非常易读的:

>>> 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'
于 2013-07-14T22:58:50.480 回答
2

好的,没有环视和没有回调函数:

re.sub('(^|[^$])\$([^$]|$)', '\1z\2', s)
于 2013-07-14T23:40:57.107 回答
2

唔。如果我同时使用前瞻和后视,看起来我可以让它工作。不过,似乎应该有一个更简单的方法。

>>> re.sub('(?<!\$)\$(?!\$)','z',s)
'za $$b $$$c zd'
于 2013-07-14T22:12:42.390 回答
0

An alternative with re.split:

''.join('z' if x == '$' else x for x in re.split('(\$+)', s))
于 2013-07-15T00:10:02.050 回答