【发布时间】:2020-12-22 15:29:49
【问题描述】:
我正在尝试替换下面txt文件中.之后的每个单词:
line1
line2
field: [orders.cancelled,orders.delivered,orders.reached
orders.pickup,orders.time]
some line
some line
我有一本字典:
d = {'cancelled':'cancelled_at', 'deliver':'xxx'}
我正在运行以下代码。但是,我得到了部分匹配的结果,即
我看到新文件有以下文字
field: [orders.cancelled_at, orders.xxxed ..........
从交付的单词来看,程序仍在替换前 7 个单词(交付)并在末尾添加“ed”。我不知道为什么
with open('list.txt', 'r') as g:
text = g.read()
for k in d:
before = f'.{k}'
after = f'.{d[k]}
#print(before)
#print(after)
text = text.replace(before, after)
#print(text)
with open('new_list.txt', 'w') as w:
w.write(text)
我也试过这个,我得到了同样的结果
import re
with open('list.txt', 'r') as f:
text = f.read()
for k in d:
before = f'.{k}(?!=\w)'
print(before)
after = f'.{d[k]}'
print(after)
text = re.sub(before, after, text)
with open('new_list.txt', 'w') as w:
w.write(text)
【问题讨论】:
-
您正在用 xxx 替换
delivered中的deliver。结果是xxxed。将"delivered": "xxx"添加到您的字典中。 -
1) 使用单词边界来匹配整个单词,2) 在字符类之外转义
.以匹配文字. -
@spyralab 如果键的值是“交付”而不是“交付”,我只想删除点后面的单词。如果找不到完全匹配,我希望程序不会更改任何内容,在这种情况下,它应该将新行作为 orders.cancelled_at, orders._delivered
-
f'\b{k}\b' - 这应该有效吗? @WiktorStribiżew 抱歉,我对正则表达式不太熟悉,如果您能解释更多,将不胜感激
-
\b单词边界只有在字符串中有整个单词时才需要匹配,因此short\b将匹配short.而不是shorts。
标签: python regex string dictionary replace