regex 仅当前缀和后缀匹配时才使用re.sub替换字符串

fruv7luv  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(84)

我正试图使用自定义词典将德语单词转换为英语。在下面的代码中,只有当匹配单词的后缀或前缀福尔斯字符时,才应该进行替换

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

字符串
举例来说:
Mein应该首先转换,但不是在MeinName中转换,因为前缀和后缀不是上面提到的字符。如果有像_MeinMein.这样的单个单词,则需要转换它们。

import re

string = "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()],
    string
)


预期的输出:

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

new9mtju

new9mtju1#

您可以使用

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 demo
正则表达式看起来像

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


参见regex demo。详细信息:

  • (?:Mein|ist|Wo|bist|du|is)-备选字符串之一
  • (?=[,/!?()_0-9\-=+."\s\'])-一个肯定的前瞻,匹配一个位置,紧跟着,/!?)(_、一个数字、-=+."、空白和'

相关问题