【问题标题】:Add text 2 lines before match in python在python中匹配之前添加文本2行
【发布时间】:2019-03-28 04:21:34
【问题描述】:

我正在尝试查找“AAXX”并在上面两行添加“Hello”这个词:

Input:
111
222
AAXX
333
444
AAXX
555
666
AAXX

Output: 
Hello 
111
222
AAXX
Hello
333 
444
AAXX
Hello
555
666
AAXX

我已经设法通过使用下面的代码在第一个“AAXX”之前的两行插入一个“Hello”,但我无法让它循环遍历文件并对所有“AAXX”匹配项执行相同的操作。

import os

with open(os.path.expanduser("~/Desktop/test.txt"), "r+") as f:
    a = [x.rstrip() for x in f]
    for i, item in enumerate(a):
        if item.startswith("AAXX"):
            a.insert(i-2,"Hello")
            break
        index += 1
    # Go to start of file and clear it
    f.seek(0)
    f.truncate()
    # Write each line back
    for line in a:
        f.write(line + "\n")

到目前为止,我得到:

Hello
111
222
AAXX
333
444
AAXX
555
666
AAXX

【问题讨论】:

  • 您输入的类型是什么?字符串或列表
  • index += 1的作用是什么?
  • @pyd 这是一个字符串 :)
  • @Yusufsn 感谢您的提问。你可以忽略那部分。我只是尝试了没有它并没有改变任何东西。

标签: python loops line add


【解决方案1】:

您可以尝试以下方法吗:

with open('test.txt', 'r') as infile:
    data = infile.read()
final_list = []
for ind, val in enumerate(data.split('\n')):
    final_list.append(val)
    if val == 'AAXX':
        final_list.insert(-3, 'HELLO')
# save the text file
with open('test.txt', 'w') as outfile:
    data = outfile.write('\n'.join(final_list))

输出:

HELLO
111
222
AAXX
HELLO
333
444
AAXX
HELLO
555
666
AAXX

【讨论】:

  • 太棒了。非常感谢@Jeril
【解决方案2】:
def p(a):
    r = []
    for i, item in enumerate(a):
        if item.startswith("AAXX"):
            r.append(i)
    for i in reversed(r):
        a.insert(i-2,"HELLO")
    return(a)

您可以根据自己的需要处理输入/输出。您需要修复前两项中出现“AAXX”的情况,因为您尚未定义您想要的行为。关键问题是在迭代列表时修改列表是不好的做法,特别是后面的索引可能会关闭,因为您已经插入了早期的“HELLO”。一种可能的解决方案是跟踪所有插入索引,然后以 reverse 顺序进行插入,因为在列表中稍后插入不会影响之前的索引。

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 2021-03-19
    • 1970-01-01
    • 2018-10-21
    • 2013-08-21
    • 2012-02-12
    • 2015-07-07
    • 2018-03-02
    • 1970-01-01
    相关资源
    最近更新 更多