仅当特定字符不在pai中时才对该字符进行拆分的正则表达式

2024-09-19 23:34:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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.']

基本上,我需要一个正则表达式,它将拆分成对的第一个和符,以及每个单个和号,以允许我通过字典对其进行转义。在

如果有人有更好的解决方案,请随时告诉我。在


Tags: 方法字符串re字典解决方案this字符tmp
3条回答

我认为这是个诀窍:

import re

def fix(text):
    dict = {"y":"\033[0;30m",
            "c":"\033[0;31m",
            "b":"\033[0;32m",
            "Y":"\033[0;33m",
            "u":"\033[0;34m",
            "&":"&"}

    myparts = re.split('\&(\&*)', text)
    myparts[1:]=[dict.get(x[0],"&"+x[0])+x[1:] if len(x) > 0 else x for x in myparts[1:]]
    result = "".join(myparts)
    return result


print fix("The &yquick &cbrown &bfox &Yjumps over the &ulazy dog")
print fix("&yI &creally &blove A && W &uRootbeer.")

您可以使用否定lookbehind(假设有问题的regex引擎支持它)来只匹配不跟在另一个和号后面的和号。在

/(?<!&)&/

可能循环while(q=str.查找('&;',p))!=-1,然后追加左侧(p+2到q-1)和替换值。在

相关问题 更多 >