【问题标题】:Adding quotes to text in line using Python使用 Python 为文本添加引号
【发布时间】:2022-01-22 22:03:17
【问题描述】:

我正在使用 Visual Studio Code 用 Python 替换文本。 我正在使用带有原始文本的源文件并将其转换为带有新文本的新文件。

我想在后面的新文本中添加引号。例如:

原文:set vlans xxx vlan-id xxx

新文本:vlan xxx name "xxx"(在该行的剩余部分添加引号,如此处所示)

这是我的代码:

    with open("SanitizedFinal_E4300.txt", "rt") as fin:
        with open("output6.txt", "wt") as fout:
            for line in fin:
                     line = line.replace('set vlans', 'vlan').replace('vlan-id', 'name')
                     fout.write(line)

有没有办法在“名称”后面的行中为文本添加引号?

编辑:

我试过这段代码:

    with open("SanitizedFinal_E4300.txt", "rt") as fin:
    with open("output6.txt", "wt") as fout:
    for line in fin:
     line = line.replace('set vlans', 'vlan').replace('vlan-id', 'name')
     words = line.split()
        words[-1] = '"' + words[-1] + '"'
        line = ' '.join(words)
     fout.write(line)

并收到此错误:

line 124, in <module>
words[-1] = '"' + words[-1] + '"'
IndexError: list index out of range

我也试过这段代码,但没有成功:

    with open("SanitizedFinal_E4300.txt", "rt") as fin:
    with open("output6.txt", "wt") as fout:
    for line in fin:
    line = line.replace('set vlans', 'vlan').replace('vlan-id', 'name')
    
    import re
        t = 'set vlans xxx  vlan-id xxx'
        re.sub(r'set vlans(.*)vlan-id (.*)', r'vlan\1names "\2"', t)
        'vlan xxx  names "xxx"'

同样,我的目标是在行尾的字符(vlan 编号)中自动添加双引号。

例如:

原文:set protocols mstp configuration-name Building 2021.Rm402.access.mstp.zzz

所需文本:设置协议 mstp 配置名称“Building 2021.Rm402.access.mstp.zzz”

【问题讨论】:

  • 您可以尝试 split 根据空格拆分单词,然后添加引号,然后将 join 再次组合在一起。或者,您可以查看更常用的方法,例如正则表达式
  • 在正则表达式中捕获整行,并使用\1\2 替换字符串来填充捕获组,使用re.sub() 方法
  • @ProQ 你能发布一个例子来说明它的外观/工作原理吗?
  • cesarv 涵盖了正则表达式之一,所以我将展示拆分/加入一个。抱歉,我一开始没有时间写完整的答案 - 因此评论
  • 另外,为了让您更好地习惯使用该网站,如果您添加您已经尝试过的内容,或者如果您没有尝试过任何内容,您查看过哪些页面会有所帮助资源。如果您有此信息,我会支持您的问题。

标签: python replace quotes double-quotes


【解决方案1】:

使用以下正则表达式:

>>> import re
>>> t = 'set vlans xxx  vlan-id xxx'
>>> re.sub(r'set vlans(.*)vlan-id (.*)', r'vlan\1names "\2"', t)
'vlan xxx  names "xxx"'

搜索模式(第一个参数)中的括号用于创建可用于替换模式(第二个参数)的组。所以搜索模式中的第一个(.*)匹配将通过\1的方式包含在替换模式中;第二个也是一样。

编辑: 我分享的代码只是一个如何使用正则表达式的例子。以下是您应该如何使用它。

import re

# whatever imports and code you have down to...

with open("SanitizedFinal_E4300.txt", "rt") as fin, open("output6.txt", "wt") as fout:
    for line in fin:
        line = re.sub(r'set vlans(.*)vlan-id (.*)', r'vlan\1names "\2"', line)
        fout.write(line)

重要提示:如果您需要修改的行的格式与您分享的原始文本示例有任何不同,则需要对正则表达式进行调整。

【讨论】:

    【解决方案2】:

    首先,我们通过空格将文本拆分为单词(这是split 默认所做的)。

    然后,我们取最后一个单词,给它加上引号,然后用每个单词之间的空格将它重新连接起来:

    with open("SanitizedFinal_E4300.txt", "rt") as fin:
        with open("output6.txt", "wt") as fout:
            for line in fin:
                line = line.replace('set vlans', 'vlan').replace('vlan-id', 'name')
                words = line.split()
                # print(words)                     # ['vlan', 'xxx', 'name', 'xxx']
                if words: # if the line is empty, just output the empty line
                    words[-1] = '"' + words[-1] + '"'
                    line = ' '.join(words)
                # print(line)                      # vlan xxx name "xxx"
                fout.write(line)
    

    警告:在您的问题中,您说您希望输出为vlan xxx name "xxx",在第一个xxx 之后有两个 空格。这个结果在每个单词之间只有一个空格。

    【讨论】:

    • 我试过这个没有成功。您能否阅读我在问题中所做的编辑并告诉我哪里出错了?使用我给出的例子会很棒。谢谢。
    • @SammySaucer 如果文件中有空行,则该行中将没有单词,因此 [-1] 将是无效索引。目前正在上课,其他事情稍后再回复
    • 好的,我下课了,仔细看了看;我认为我的上述评论是正确的。如果您跳过空行或不是您在问题中给出的格式的行,我仍然相信我的解决方案应该有效。您的文件末尾可能还有一个隐藏的换行符。同样,跳过空行应该可以解决它。我将更改答案中的代码以更新此内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2015-05-11
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多