0

我想创建在数组中查找字符串的函数,然后替换字典中的对应元素。到目前为止,我已经尝试过了,但我无法弄清楚像

  1. 如何转义特殊字符
  2. 我可以用找到的匹配替换。我试过\1但没用

dsds

def myfunc(h):
        myarray = {
                "#":"\\#",
                "$":"\\$",
                "%":"\\%",
                "&":"\\&",
                "~":"\\~{}",
                "_":"\\_",
                "^":"\\^{}",
                "\\":"\\textbackslash{}",
                "{":"\\{",
                "}":"\\}"                
                    }
        pattern = "[#\$\%\&\~\_\^\\\\\{\}]"
        pattern_obj = re.compile(pattern, re.MULTILINE)
        new = re.sub(pattern_obj,myarray[\1],h)

        return new
4

4 回答 4

3

您正在寻找 re.sub 回调:

def myfunc(h):
    rules = {
            "#":r"\#",
            "$":r"\$",
            "%":r"\%",
            "&":r"\&",
            "~":r"\~{}",
            "_":r"\_",
            "^":r"\^{}",
            "\\":r"\textbackslash{}",
            "{":r"\{",
            "}":r"\}"                
    }
    pattern = '[%s]' % re.escape(''.join(rules.keys()))
    new = re.sub(pattern, lambda m: rules[m.group()], h)
    return new

这样可以避免 1) 循环,2) 替换已处理的内容。

于 2013-04-28T07:57:00.307 回答
1
  1. 我建议您使用原始文字语法 ( r"") 以提高代码的可读性。
  2. 对于您的数组,您可能只想使用str.replacefunction 而不是re.sub.
def myfunc(h):
    myarray = [
            ("\\", r"\textbackslash"),
            ("{", r"\{"),
            ("}", r"\}"),
            ("#", r"\#"),
            ("$", r"\$"),
            ("%", r"\%"),
            ("&", r"\&"),
            ("~", r"\~{}"),
            ("_", r"\_"),
            ("^", r"\^{}")]

    for (val, replacement) in myarray:
        h = h.replace(val, replacement)
    h = h.replace(r"\textbackslash", r"\textbackslash{}", h)

    return h

该代码是对@tigger 答案的修改。

于 2013-04-28T07:43:07.660 回答
1

您可以尝试在遍历 myarray.items() 的循环中使用 re.sub。但是,您必须先执行反斜杠,否则可能会错误地替换内容。您还需要确保“{”和“}”首先发生,以免混淆匹配。由于字典是无序的,我建议您改用元组列表:

def myfunc(h):
    myarray = [
            ("\\","\\textbackslash")
            ("{","\\{"),
            ("}","\\}"),
            ("#","\\#"),
            ("$","\\$"),
            ("%","\\%"),
            ("&","\\&"),
            ("~","\\~{}"),
            ("_","\\_"),
            ("^","\\^{}")]

    for (val, replacement) in myarray:
        h = re.sub(val, replacement, h)
    h = re.sub("\\textbackslash", "\\textbackslash{}", h)

    return h
于 2013-04-28T07:27:35.603 回答
0

要转义元字符,请使用原始字符串和反斜杠

r"regexp with a \* in it"
于 2013-04-28T07:32:01.840 回答