繁体   English   中英

字符串操作/正则表达式 - 查找和替换

[英]string operation/regex - find and replace

我试图在. 在下面的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)

您可以使用

import re

d = {'cancelled':'cancelled_at', 'deliver':'xxx'}
rx = re.compile(fr"(?<=\.)(?:{'|'.join(d)})\b")

with open('list.txt', 'r') as f:
    print( re.sub(rx, lambda x: d[x.group()], f.read()) )

查看Python 演示

代码生成的正则表达式看起来像

(?<=\.)(?:cancelled|deliver)\b

请参阅正则表达式演示 细节:

  • (?<=\\.) - 一个正面的lookbehind,它匹配紧跟在文字前面的位置.
  • (?:cancelled|deliver) - 两种选择: cancelleddeliver
  • \\b - 作为整个单词, \\b是单词边界。

lambda x: d[x.group()]替换用相应的字典键值替换匹配的单词。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM