我想对值对列表进行排序,稍后我将使用这些值进行文本替换。代码不应对同一元素进行一次替换,然后进行第二次替换。所以我想对替换列表对进行排序,以防止多个替换。
程序搜索文本。当它找到与替换对中的第一个元素匹配的文本时,它将用第二个元素替换它。
我的替换列表的片段如下所示:
subst_list = [
['AI_010306', 'AI_010307'],
['AI_010307', 'AI_010308'],
['AI_010310', 'AI_010309'],
['AI_010311', 'AI_010310']]
要替换的原始文本片段如下所示:
old_text = "AI_010306 AI_010307 AI_010310 AI_010311"
所需的新文本是:
new_text = "AI_010307 AI_010308 AI_010309 AI_010310"
我希望替换列表如下所示:
subst_list = [
['AI_010307', 'AI_010308'],
['AI_010306', 'AI_010307'],
['AI_010310', 'AI_010309'],
['AI_010311', 'AI_010310']]
如果某个值同时出现在第一个元素集和第二个元素集中,则第一个位置具有该值的对应该在列表中排在前面。
我不想替换“AI_010306”->“AI_010307”,然后替换“AI_010307”->“AI_010308”。
在这种情况下,一个集合中的字符串不存在作为另一集合的子字符串出现的风险。
我尝试按第一个元素排序,也尝试按第二个元素排序,但都不满足条件。所以,与此同时,我一直在手工对这些行进行排序。
以下是替换程序:
with open("source.txt") as f:
lines = f.readlines()
for line in lines:
new_line = line.rstrip()
for s in subst_list:
new_line = new_line.replace(s[0], s[1])
print(new_line.rstrip())
我也尝试过使用字典而不是列表,但结果是一样的。
with open("source.txt") as f:
lines = f.readlines()
for line in lines:
new_line = line.rstrip()
for s in subst_dict:
new_line = new_line.replace(s, subst_dict[s])
print(new_line.rstrip())
import re
from typing import Dict
def replace_tokens(input_text: str, substitutions: Dict[str, str]) -> str:
input_tokens = re.split('(\\s+)', input_text)
new_tokens = [substitutions.get(token, token) for token in input_tokens]
return "".join(new_tokens)
substitutions_dict = {
'AI_010306': 'AI_010307',
'AI_010307': 'AI_010308',
'AI_010310': 'AI_010309',
'AI_010311': 'AI_010310'
}
old_text = "AI_010306 AI_010307 AI_010310 AI_010311"
print(replace_tokens(old_text, substitutions_dict))