在this thread中找到最快的字符串替换算法后,我一直在尝试修改其中一个以满足我的需要,特别是gnibbler的this one。在
我将在这里再次解释这个问题,以及我遇到的问题。在
假设我有一个像这样的字符串:
str = "The &yquick &cbrown &bfox &Yjumps over the &ulazy dog"
您会注意到字符串中有很多位置,其中有一个和号,后跟一个字符(例如“&y”和“&c”)。我需要用字典中的适当值替换这些字符,如下所示:
^{pr2}$使用上一篇文章中提供的gnibblers解决方案,我将此作为当前的解决方案:
myparts = tmp.split('&')
myparts[1:]=[dict.get(x[0],"&"+x[0])+x[1:] for x in myparts[1:]]
result = "".join(myparts)
因为在这个作品中没有找到合适的字符替换。唯一的问题是,没有一种简单的方法可以让实际上在输出中保留一个与号。我能想到的最简单的方法就是把我的字典改成:
dict = {"y":"\033[0;30m",
"c":"\033[0;31m",
"b":"\033[0;32m",
"Y":"\033[0;33m",
"u":"\033[0;34m",
"&":"&"}
并更改我的“split”调用,对后面不跟其他和号的和号执行正则表达式拆分。在
>>> import re
>>> tmp = "&yI &creally &blove A && W &uRootbeer."
>>> tmp.split('&')
['', 'yI ', 'creally ', 'blove A ', '', ' W ', 'uRootbeer.']
>>> re.split('MyRegex', tmp)
['', 'yI ', 'creally ', 'blove A ', '&W ', 'uRootbeer.']
基本上,我需要一个正则表达式,它将拆分成对的第一个和符,以及每个单个和号,以允许我通过字典对其进行转义。在
如果有人有更好的解决方案,请随时告诉我。在
我认为这是个诀窍:
您可以使用否定lookbehind(假设有问题的regex引擎支持它)来只匹配不跟在另一个和号后面的和号。在
可能循环while(q=str.查找('&;',p))!=-1,然后追加左侧(p+2到q-1)和替换值。在
相关问题 更多 >
编程相关推荐