2013-07-14 207 views
2

我试图用其他东西替换单个$个字符,并且想要忽略连续的多个$个字符,我不能完全弄明白。我试着用前瞻:用python regexp替换一个字符的单个实例

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

这给了我:

'za $zb $$zc zd' 

当我要的是

'za $$b $$$c zd' 

我在做什么错?

回答

3

笔记,如果不使用可调用的替换功能:

  • 你需要前瞻,因为如果随后$
  • 你一定不能匹配你需要查找落后原因你一定不匹配如果先进行$

不是优雅,但,这是非常具有可读性:

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

嗯。看起来,如果我同时使用了前视和后视,我可以实现它。但似乎应该有一个更简单的方法。

>>> re.sub('(?<!\$)\$(?!\$)','z',s) 
'za $$b $$$c zd' 
+0

仍然是最短的方式来完成任务+1。 – dnozay

2

好,无环视并没有回调函数:

re.sub('(^|[^$])\$([^$]|$)', '\1z\2', s) 
0

另一种与re.split

''.join('z' if x == '$' else x for x in re.split('(\$+)', s)) 
相关问题