Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python仅在前缀和后缀匹配时使用re.sub替换字符串_Python_Regex_Re - Fatal编程技术网

Python仅在前缀和后缀匹配时使用re.sub替换字符串

Python仅在前缀和后缀匹配时使用re.sub替换字符串,python,regex,re,Python,Regex,Re,我正在尝试使用自定义词典将德语单词转换成英语。 在下面的代码中,仅当匹配单词的后缀或前缀为字符时,才应进行替换 [,\/!?()\u 1234567890-=+.“”] 例如: Mein应该首先转换,但不能在MeinName中转换,因为前缀和后缀不是上面提到的字符。如果有像\u Mein或Mein.这样的单个单词,则需要对其进行转换 import re str = "Mein ,Name, ist John, Wo23 bist+ ,_du? , MeinName " r

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

[,\/!?()\u 1234567890-=+.“”]
例如:
Mein
应该首先转换,但不能在
MeinName
中转换,因为前缀和后缀不是上面提到的字符。如果有像
\u Mein
Mein.
这样的单个单词,则需要对其进行转换

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)
预期产出:

我的名字是约翰,你在哪里,梅尼娜
您可以使用

重新导入
s=“我的名字,我是约翰,Wo23 bist+,_du?,我的名字”
replacements={“Mein”:“my”,“ist”:“is”,“Wo”:“where”,“bist”:“are”,“du”:“you”,“is”:“iis”}
rx=r'(?:{})(?=[,/!?()0-9\-=+。“\s\'])。格式(“|”)。连接(映射(re.escape,replacements.keys())
打印(rx)
打印(re.sub(rx,lambda m:replacements[m.group()],s))
#=>我的名字是约翰,其中23个是+,你呢?,麦纳姆

正则表达式看起来像

(?:Mein | ist | Wo | bist | du | is)(?=[,/!?()0-9 \-=+。“\s\”)
看。详情:

  • (?:Mein | ist | Wo | bist | du | is)
    -可选字符串之一
  • (?=[,/!?())
    、空格和

您的预期输出与您的规则不匹配:
is234
is
之后有一个
2
,因此,它应该被替换为
is
。在输出中
du
之前在哪里消失?现在,请尝试
rx=r'(?:{})(?=[,/!?()[u 0-9\-=+。“\s\”)'))。格式(''.''.'.''.'.''.''.''.'''.join(map(re.escape,res keys())).replacements())Wikor编辑了预期的输出。好,对你有用吗?谢谢。Wikter StBiBi谢谢Wikor的回答。我不知道前瞻/后视图的概念。在这里我使用了积极的前瞻和向后看,并且能够达到预期的结果。@ ScChaySty很高兴为你工作。请考虑接受CLIC的答案。国王✓ 在左边(参见)。