【问题标题】:Multiple word replacement by list - duplicates creation通过列表替换多个单词 - 重复创建
【发布时间】:2016-07-17 05:04:32
【问题描述】:

有替换列表(http://pastebin.com/JH932Qxi) 并列出需要替换的内容(http://pastebin.com/RSwdWiKy)。 更换规则:

S1000005    =   S1000005,S1000006,S1000010
S1000007    =   S1000007,S1000008
S1000009    =   S1000009
S2000005    =   S2000005,S2000006,S2000007,S2000008
S2000009    =   S2000009,S2000010
S3000005    =   S3000005,S3000010
S3000006    =   S3000006,S3000008
S3000007    =   S3000007,S3000009

输入行:

S1000005    S2000005    S3000005
S1000006    S2000006    S3000006
S1000007    S2000007    S3000007
S1000008    S2000008    S3000008
S1000009    S2000009    S3000009
S1000010    S2000010    S3000010

结果应该是这样的http://pastebin.com/8BkRFC87

示例输出:

S1000005    S2000005    S3000005
S1000005    S2000005    S3000006
S1000007    S2000005    S3000007
S1000007    S2000005    S3000006
S1000009    S2000009    S3000007
S1000005    S2000009    S3000005

我已经使用 notepad++ 完成了这项工作(它节省了很多时间),但可以完全自动化。 (起初,我将行拆分,而不是使用书签行替换,而不是返回 3 列)。

如何阅读替换列表以创建替换全权委托?以及如何使用字典通过替换来制作重复列表?

或者是否有任何文本编辑器可以搜索“S1000005,S1000006,S1000010,S1000011,S1000022,S1000023,S1000024,S1000025,S1000056”并将每个替换为“S1000005”?

【问题讨论】:

  • 请展示您尝试过的内容并解释无效的内容。创建一个不需要所有外部链接的小例子。
  • 您希望使用哪种语言?你永远不会在这种事情上混合使用 Python 和 Tcl。这将是荒谬的复杂!
  • @DonalFellows 我更喜欢 Python 或 TCL。
  • @ChrisP 我尝试过的 - notepad++c 中的多个单词替换 - 没有选项,只能使用书签替换行。

标签: python regex list replace tcl


【解决方案1】:

从第一个文件中获取字典{被替换:替换}:

replace = {}
with open('input1') as fd:
    for line in fd:
        head, tail = line.split('=')
        for idt in tail.split(','):
            replace[idt] = head

将第二个文件input2的内容写入output,并进行替换:

with open('input2') as ifd, open('output', 'w') as ofd:
    for line in ifd:
        ofd.write('    '.join(replace.get(idt, idt) for idt in line.split()))

这里,dict.get 方法用于替换标识符,或者如果字典中不存在标识符本身。

在 vim 文本编辑器中,将 S1000005,S1000006,S1000010,S1000011,S1000022,S1000023,S1000024,S1000025,S1000056 替换为 S1000005 的正则表达式为:

%s/S1000005\|S1000006\|S1000010\|S1000011\|S1000022\|S1000023\|S1000024\|S1000025\|S1000056/S1000005/g

在其他文本编辑器中,某些字符可能需要转义 \。取决于使用的正则表达式引擎。 其他正则表达式引擎可以接受这个:

s/{S1000005,S1000006,S1000010,S1000011,S1000022,S1000023,S1000024,S1000025,S1000056}/S1000005/g

【讨论】:

  • vim 编辑器中的替换是快速而优雅的解决方案。但我会尝试让 python 代码工作。
  • 使用此代码会产生 2 种类型的错误:TypeError: 需要一个字符缓冲区对象 (Pythin 2.7) 和 TypeError: write() 参数必须是 str,而不是生成器 (3.5)。
  • 抱歉打错了,我忘了.join。现已修复。
  • 一些替换不起作用,请比较我的手工输出pastebin.com/8BkRFC87 和从这段代码pastebin.com/K01cNGVm 行中的最后一个元素没有被替换
  • 好的,需要在行尾加','
猜你喜欢
  • 1970-01-01
  • 2015-05-18
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多