首页 > 解决方案 > 仅当前缀和后缀匹配时,Python 才使用 re.sub 替换字符串

问题描述

我正在尝试使用自定义词典将德语单词转换为英语。在下面的代码中,仅当匹配单词的后缀或前缀落在字符中时才会发生替换

[,\/!?()_1234567890-=+."""' "]

例如: Mein应该首先转换但不转换,MeinName因为前缀和后缀不是上面提到的字符。如果有单个单词 like_MeinMein.需要转换。

import re

str = "Mein ,Name, ist John, Wo23 bist+ ,_du? , MeinName "
replacements = { 'Mein':'my', 'ist':'is', 'Wo':'where', 'bist':'are', 'du':'you', 'is':'iis'}
re.sub('({})'.format('|'.join(map(re.escape, replacements.keys()))), lambda m: replacements[m.group()], str)

预期输出:

my ,name,is John,where23 are+,_you? ,MeinName 

标签: pythonregexre

解决方案


您可以使用

import re
s = "Mein ,Name, ist John, Wo23 bist+ ,_du? , MeinName "
replacements = { "Mein": "my", "ist": "is", "Wo":"where", "bist":"are", "du":"you", "is" :"iis"}
rx = r'(?:{})(?=[,/!?()_0-9\-=+."\s\'])'.format('|'.join(map(re.escape, replacements.keys())))
print (rx)
print ( re.sub(rx, lambda m: replacements[m.group()], s) )
# => my ,Name, is John, where23 are+ ,_you? , MeinName 

请参阅Python 演示

正则表达式看起来像

(?:Mein|ist|Wo|bist|du|is)(?=[,/!?()_0-9\-=+."\s\'])

请参阅正则表达式演示。细节:

  • (?:Mein|ist|Wo|bist|du|is)- 替代字符串之一
  • (?=[,/!?()_0-9\-=+."\s\'])- 正向前瞻匹配紧随其后的位置,,, /, !, , ?, ), (, _, 一个数字, -, =, +, ., ", 空格和'.

推荐阅读