我有一本REPLACEMENTS的词典,它的关键字是我想要查找的exactly的字符串.然后,我想用它们对应的字典值替换它们.

例如,

REPLACEMENTS = dict([('max.' , ' maximum '),
                     ('inkl.' , ' inklusive '),
                     ('z.b.' , ' zum beispiel '),
                     ('ggf.', ' gegebenfalls ')])

sample_input_text = "Hallo, ggf ggf. max z.b. alpha z.b beta ca. 25 cm ca inkl. inkl. inkl"

Expected output

"Hallo, ggf  gegebenfalls max zum beispiel alpha z.b beta circa 25 cm ca inklusive inklusive inkl"`

正如您所注意到的,我不想替换像ggfcainkl这样的单词,因为它们与字典中的关键字ggf.ca.inkl.不完全匹配,因为缺少点.

My Attempt:

正如您在下面看到的,我得到的'ggf ', 'max ''z.b '这样的匹配项与字典中的关键字不完全匹配.然后,当我使用re.sub时,这些部分匹配项将被空白字符替换.

import re

REPLACEMENTS = dict([('max.' , ' maximum '),
                     ('inkl.' , ' inklusive '),
                     ('z.b.' , ' zum beispiel '),
                     ('ggf.', ' gegebenfalls ')])

sample_input_text = "Hallo, ggf ggf. max z.b. alpha z.b beta ca. 25 cm ca inkl. inkl. inkl"

joined = '|'.join(REPLACEMENTS.keys())

print(re.findall(joined, sample_input_text))

>> ['ggf ', 'ggf.', 'max ', 'z.b.', 'z.b ', 'inkl.', 'inkl.']

pattern = re.compile(joined)

output_text = pattern.sub(lambda m: REPLACEMENTS.get(m.group()), sample_input_text)
print(output_text)

>> 'Hallo,  gegebenfalls  zum beispiel  alpha beta ca. 25 cm ca  inklusive   inklusive  inkl'

这个问题的正则表达式模式是什么?

推荐答案

以下是固定代码:

import re
REPLACEMENTS = dict([('max.' , ' maximum '),
                     ('inkl.' , ' inklusive '),
                     ('z.b.' , ' zum beispiel '),
                     ('ggf.', ' gegebenfalls '),
                     ('ca.' , ' circa ')])

sample_input_text = "Hallo, ggf ggf. max z.b. alpha z.b beta ca. 25 cm ca inkl. inkl. inkl"
joined = r'\b(?:' + '|'.join(map(re.escape, REPLACEMENTS.keys())) + r')(?!\B\w)'
print(re.findall(joined, sample_input_text))

pattern = re.compile(joined)
output_text = pattern.sub(lambda m: REPLACEMENTS.get(m.group()), sample_input_text)
print(output_text)

请看Python demo.输出:

Hallo, ggf  gegebenfalls  max  zum beispiel  alpha z.b beta  circa  25 cm ca  inklusive   inklusive  inkl

NOTE:

  • 为了容纳circa人,我在REPLACEMENTS本词典的基础上又增加了('ca.' , ' circa ')
  • The pattern is built using r'\b(?:' + '|'.join(map(re.escape, REPLACEMENTS.keys())) + r')(?!\B\w)':
    • 开头的\b与单词边界匹配
    • map(re.escape, REPLACEMENTS.keys())转义要在正则表达式中使用的每个键(点需要转义以匹配文字点)
    • 由于键以.结尾(我想可能还有其他以单词字符结尾的缩写),因此不能依赖\b,但可以使用adaptive word boundary.如果找到的关键字以单词char结尾,则(?!\B\w)确保存在单词边界.

Python相关问答推荐

有什么方法可以修复奇怪的y轴Python matplotlib图吗?

单击Python中的复选框后抓取数据

Altair -箱形图边界设置为黑色,中线设置为红色

Numpy索引argsorted使用integer数组,同时保留排序顺序

自定义新元未更新参数

将numpy矩阵映射到字符串矩阵

如何让 turtle 通过点击和拖动来绘制?

韦尔福德方差与Numpy方差不同

滚动和,句号来自Pandas列

使用miniconda创建环境的问题

用Python解密Java加密文件

如何在solve()之后获得症状上的等式的值

Python中绕y轴曲线的旋转

Pandas计数符合某些条件的特定列的数量

如何在Python中获取`Genericums`超级类型?

Python Pandas获取层次路径直到顶层管理

重置PD帧中的值

在代码执行后关闭ChromeDriver窗口

人口全部乱序 - Python—Matplotlib—映射

为什么我的sundaram筛这么低效