在Python中使用Regex查找和替换精确缩写的匹配

68de4m5k  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(132)

我有一个REPLACEMENTS字典,它的键是我想找到的字符串。然后我想用它们对应的字典值替换它们。
比如说,

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"

预期产出

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

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

我的尝试:

正如你在下面看到的,我得到了像'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'

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

uqzxnwby

uqzxnwby1#

下面是固定代码:

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

备注

  • 为了适应circa,我将('ca.' , ' circa ')添加到REPLACEMENTS字典中
  • 该模式使用r'\b(?:' + '|'.join(map(re.escape, REPLACEMENTS.keys())) + r')(?!\B\w)'构建:
  • \b在开始匹配一个词的边界
  • map(re.escape, REPLACEMENTS.keys())转义正则表达式中使用的每个键(点需要转义以匹配文字点)
  • 由于键以.结尾(我想可能还有其他以单词字符结尾的缩写),因此您不能依赖\b,但可以使用adaptive word boundary(?!\B\w)确保如果找到的键以单词char结尾,则存在单词边界。

相关问题