我正试图用刺痛取代'和'。这是dict:
char_replace_list = {
'"': '"',
"'": ''',
'&': '&',
'<': '<',
'>': '>',
}
这就是我所做的:
s = '\' " & < >'
pattern = re.compile(r'\b(' + '|'.join(self.char_replace_list.keys()) + r')\b')
pattern.sub(lambda x: char_replace_list[x.group()], s)
结果是:
' " & < >
我哪里做错了?
答案 0 :(得分:0)
有趣的是,我得到了一个不同的结果,我的机器上根本没有替换。
您的问题是这些标点字符的边缘不被视为字边界(以平台相关的方式!?):
\b
匹配空字符串,但仅匹配单词的开头或结尾。 单词被定义为字母数字或下划线字符序列,因此单词的结尾由空格或非字母数字非下划线字符表示。请注意,正式地,
\b
被定义为\w
和\W
字符之间的边界(反之亦然),或\w
与字符串的开头/结尾之间的边界,被视为字母数字的精确字符集取决于UNICODE
和LOCALE
标记的值。例如,r'\bfoo\b'
匹配'foo'
,'foo.'
,'(foo)'
,'bar foo baz'
,但不匹配'foobar'
或'foo3'
。在字符范围内,\b
表示退格符,以便与Python的字符串文字兼容。
而不是\b...\b
,您可以使用(?<= |^)...(?= |$)
答案 1 :(得分:0)
在这种情况下,您可以使用translate方法:
char_replace_list = {
'"': '"',
"'": ''',
'&': '&',
'<': '<',
'>': '>',
}
s = '\' " & < >'
# table translate from a mapping
t = "".maketrans(char_replace_list)
print(s.translate(t))
# ' " & < >