Python使用带有dict的re.sub替换配额和撇号

时间:2016-03-14 15:05:57

标签: python

我正试图用刺痛取代'和'。这是dict:

char_replace_list = {
    '"': '"',
    "'": ''',
    '&': '&',
    '<': '&lt',
    '>': '&gt',
}

这就是我所做的:

s = '\' " & < >'
pattern = re.compile(r'\b(' + '|'.join(self.char_replace_list.keys()) + r')\b')
pattern.sub(lambda x: char_replace_list[x.group()], s)

结果是:

' " &amp; &lt; &gt;

我哪里做错了?

2 个答案:

答案 0 :(得分:0)

有趣的是,我得到了一个不同的结果,我的机器上根本没有替换。

您的问题是这些标点字符的边缘不被视为字边界(以平台相关的方式!?):

  

\b

     

匹配空字符串,但仅匹配单词的开头或结尾。 单词被定义为字母数字或下划线字符序列,因此单词的结尾由空格或非字母数字非下划线字符表示。请注意,正式地,\b被定义为\w\W字符之间的边界(反之亦然),或\w与字符串的开头/结尾之间的边界,被视为字母数字的精确字符集取决于UNICODELOCALE标记的值。例如,r'\bfoo\b'匹配'foo''foo.''(foo)''bar foo baz',但不匹配'foobar''foo3'。在字符范围内,\b表示退格符,以便与Python的字符串文字兼容。

而不是\b...\b,您可以使用(?<= |^)...(?= |$)

答案 1 :(得分:0)

在这种情况下,您可以使用translate方法:

char_replace_list = {
    '"': '&quot;',
    "'": '&apos;',
    '&': '&amp;',
    '<': '&lt',
    '>': '&gt',
}
s = '\' " & < >'
# table translate from a mapping
t = "".maketrans(char_replace_list)
print(s.translate(t))
# &apos; &quot; &amp; &lt &gt