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

标签 python regex string dictionary 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 ..........

这里从单词 delivered 开始,程序仍然替换前 7 个单词 (deliver) 并在最后添加 '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 demo

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

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

参见 regex demo .详情:

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

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

关于python - 字符串操作/正则表达式 - 查找和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63722859/

相关文章:

java - 查找字符串 2 在字符串 1 中开始的索引

string - 检索存储在 SQFlite 数据库(Flutter)中的数据?

python - 导入错误 : No module named bz2 for Python 2. 7.2

python - 序列文件名用作 Hadoop 输出中的键?

python - 抓取多个表并将一些行作为列标题

Javascript 如果数组包含带有正则表达式的字符串

python-3.x - 从产品描述中提取数字数据

Javascript 正则表达式检测字符串中的 CSS 代码?

python - 将 numpy 数组转换为给定格式的字符串

python - 如何在 python 中表示图形/树以及如何检测循环?