给定一个字符串和一个应该替换为占位符的子字符串列表,例如:
第一个目标是先用索引占位符替换
最后一步是以相反的方式进行替换,并放回原始短语,即:
我们得到了一个尴尬的输出:
import re
from copy import copy
phrases = ["'s morgen", "'s-Hertogenbosch", "depository financial institution"]
original_text = "Something, 's morgen, ik 's-Hertogenbosch im das depository financial institution gehen"
第一个目标是先用索引占位符替换
phrases
中的子字符串,例如在original_text
中。text = copy(original_text)
backplacement = {}
for i, phrase in enumerate(phrases):
backplacement["MWEPHRASE{}".format(i)] = phrase.replace(' ', '_')
text = re.sub(r"{}".format(phrase), "MWEPHRASE{}".format(i), text)
print(text)
[out]:
Something, MWEPHRASE0, ik MWEPHRASE1 im das MWEPHRASE2 gehen
然后会有一些用于操作带有占位符的 text
的函数,例如:
cleaned_text = func('Something, MWEPHRASE0, ik MWEPHRASE1 im das MWEPHRASE2 gehen')
print(cleaned_text)
输出结果为:
MWEPHRASE0 ik MWEPHRASE1 MWEPHRASE2
最后一步是以相反的方式进行替换,并放回原始短语,即:
' '.join([backplacement[tok] if tok in backplacement else tok for tok in clean_text.split()])
[out]:
"'s_morgen ik 's-Hertogenbosch depository_financial_institution"
以下是需要翻译的内容:
phrases
中的子字符串列表很大时,执行第一个替换和最后一个回替换需要很长时间。
是否有一种方法可以使用正则表达式进行替换/回替换?
- 使用
re.sub(r"{}".format(phrase), "MWEPHRASE{}".format(i), text)
正则表达式进行替换并不是很有帮助,特别是如果短语中有与完整单词不匹配的子字符串。
例如:
phrases = ["org", "'s-Hertogenbosch", "depository financial institution"]
original_text = "Something, 's morgen, ik 's-Hertogenbosch im das depository financial institution gehen"
backplacement = {}
text = copy(original_text)
for i, phrase in enumerate(phrases):
backplacement["MWEPHRASE{}".format(i)] = phrase.replace(' ', '_')
text = re.sub(r"{}".format(phrase), "MWEPHRASE{}".format(i), text)
print(text)
我们得到了一个尴尬的输出:
Something, 's mMWEPHRASE0en, ik MWEPHRASE1 im das MWEPHRASE2 gehen
我曾尝试使用'\b{}\b'.format(phrase)
,但对于带有标点符号的短语并不起作用,例如:
phrases = ["'s morgen", "'s-Hertogenbosch", "depository financial institution"]
original_text = "Something, 's morgen, ik 's-Hertogenbosch im das depository financial institution gehen"
backplacement = {}
text = copy(original_text)
for i, phrase in enumerate(phrases):
backplacement["MWEPHRASE{}".format(i)] = phrase.replace(' ', '_')
text = re.sub(r"\b{}\b".format(phrase), "MWEPHRASE{}".format(i), text)
print(text)
[out]:
Something, 's morgen, ik 's-Hertogenbosch im das MWEPHRASE2 gehen
在re.sub
正则表达式模式中,有没有地方可以标识短语的单词边界?
ik
之外,所有不在phrases
中出现的字符串都被删除。为什么会这样呢? - Ajax1234然后会有一些函数来处理带有占位符的文本
。因此,你需要一个函数在添加完占位符后对文本进行操作。该函数必须对空格或其他内容进行拆分。现在,你有了一个数组,可以操作除占位符之外的所有元素,然后将其连接成字符串,最后再使用实际单词替换回占位符。正确吗? - user557597((?:(?!phrase1|phrase2|phrase3)[\S\s])+)|(phrase1|phrase2|phrase3)
。其中,捕获组1是非短语字符串部分,捕获组2是短语。 - user557597r"(?<!\w){}(?!\w)".format(phrase)
。由于您的一些关键字以非单词字符开头,因此无法使用\b
。您能否提供更多需要实现的逻辑?看起来您可能需要将回调/lambda作为第二个参数传递给re.sub
,以便仅替换每个匹配项一次。 - Wiktor Stribiżew