我需要替换一些字符如下:&➔\&,#➔\#,…
我的编码如下,但我想应该有更好的方法。有提示吗?
strs = strs.replace('&', '\&')
strs = strs.replace('#', '\#')
...
我需要替换一些字符如下:&➔\&,#➔\#,…
我的编码如下,但我想应该有更好的方法。有提示吗?
strs = strs.replace('&', '\&')
strs = strs.replace('#', '\#')
...
当前回答
也许是一个简单的循环字符替换:
a = '&#'
to_replace = ['&', '#']
for char in to_replace:
a = a.replace(char, "\\"+char)
print(a)
>>> \&\#
其他回答
仅供参考,这对OP没有什么用处,但对其他读者可能有用(请不要投反对票,我知道这一点)。
作为一个有点荒谬但有趣的练习,我想看看是否可以使用python函数式编程来替换多个字符。我很确定这并不比调用replace()两次好。如果性能是个问题,你可以用rust、C、julia、perl、java、javascript甚至awk轻松解决。它使用一个名为pytoolz的外部“助手”包,通过cython加速(cytoolz,它是一个pypi包)。
from cytoolz.functoolz import compose
from cytoolz.itertoolz import chain,sliding_window
from itertools import starmap,imap,ifilter
from operator import itemgetter,contains
text='&hello#hi&yo&'
char_index_iter=compose(partial(imap, itemgetter(0)), partial(ifilter, compose(partial(contains, '#&'), itemgetter(1))), enumerate)
print '\\'.join(imap(text.__getitem__, starmap(slice, sliding_window(2, chain((0,), char_index_iter(text), (len(text),))))))
我甚至不打算解释这一点,因为没有人会使用它来完成多次替换。尽管如此,我还是觉得这样做有点成就感,并认为它可能会激励其他读者,或者赢得一场代码混淆竞赛。
像这样简单地连接替换函数
strs = "abc&def#ghi"
print strs.replace('&', '\&').replace('#', '\#')
# abc\&def\#ghi
如果替换的数量更多,你可以用这种通用的方法
strs, replacements = "abc&def#ghi", {"&": "\&", "#": "\#"}
print "".join([replacements.get(c, c) for c in strs])
# abc\&def\#ghi
使用在python2.7和python3中可用的reduce。你可以用简洁的python方式替换多个子字符串。
# Lets define a helper method to make it easy to use
def replacer(text, replacements):
return reduce(
lambda text, ptuple: text.replace(ptuple[0], ptuple[1]),
replacements, text
)
if __name__ == '__main__':
uncleaned_str = "abc&def#ghi"
cleaned_str = replacer(uncleaned_str, [("&","\&"),("#","\#")])
print(cleaned_str) # "abc\&def\#ghi"
在python2.7中,你不需要导入reduce,但在python3中。你必须从functools模块中导入它。
迟到了,但我在这个问题上浪费了很多时间,直到我找到了答案。
简短而甜蜜,翻译是优越的替代。如果您对随时间变化的功能优化更感兴趣,请不要使用replace。
如果不知道要替换的字符集是否与用于替换的字符集重叠,也可以使用translate。
举个例子:
使用replace时,您会天真地期望代码段为“1234”。替换(“1”,“2”)。替换(“2”、“3”)。替换("3","4")返回"2344",但实际上它将返回"4444"。
翻译似乎执行了OP最初的期望。
你可以考虑写一个通用的转义函数:
def mk_esc(esc_chars):
return lambda s: ''.join(['\\' + c if c in esc_chars else c for c in s])
>>> esc = mk_esc('&#')
>>> print esc('Learn & be #1')
Learn \& be \#1
通过这种方式,您可以使用应该转义的字符列表使您的函数可配置。