Удалить слова из строки и сохранить строку в файле с Python - PullRequest
0 голосов
/ 21 октября 2019

Мне нужна следующая строка: test_list = "root / abc_test.list someText tests / long_test.list someText tests / h2.list"

, который нужно изменить на:

test_list="tests/My_test.list" 

** .list может появиться в любом месте строки.

на самом деле, что нужно сделать, это найти каждое слово, которое имеет ".list, и если это long_test.list, изменить его на My_test.list, ипосле его изменения удалите все остальные подстроки, содержащие ".list", и примите ту, которая была изменена.

, чтобы решить эту проблему, я изменил слово long_test.list на xXxXxX, а затем удалил все .listсловами, а затем изменил xXxXxX обратно на My_test.list. Для этого я использовал следующий код:

  with in_place.InPlace('RUN_NEW') as file:
      for line in file:
          line = line.replace('long_test_list', 'xXxXxX')
          file.write(line)
      file.close()

  with open("RUN_NEW","r+") as f:
      new_f = f.readlines()
      f.seek(0)
      for line in new_f:
          line = str(line).split(' ')
          print(line)
          print(len(line))
          for word in line:
              if ".list" not in word:
                  f.write(word)
      f.close()

   with open("file.txt","r+") as f:
      new_f = f.readlines()
      f.seek(0)
      for line in new_f:
          line = str(line).split(' ')

          for k in line:
               if ".list" not in k:
                  s=' '
                  print(s.join(k.split('"')))
                  #f.write(s.join(k.split('"')))

Проблема с приведенным выше кодом заключается в том, что строка после разделения на ('') выглядит как ['set', 'test_list="tests/long_test.list', 'tests/h2.list"'], когда я пытаюсь присоединить его обратно, он сохраняет его с "\n" после каждой подстроки, которая не содержит .list. Я думал о регулярном выражении, но это только удаляет .list сама, вся подстрока. И всеo Я хотел бы сохранить кавычки без их удаления во время разделения.

1 Ответ

0 голосов
/ 22 октября 2019

Этот небольшой скрипт демонстрирует, как выполнить замену в одной строке. Используйте re.sub для просмотра прочитанной строки (смоделированной здесь) и поиска двойной кавычки, за которой следует необязательная группа из любого количества символов, оканчивающихся пробелом (необязательно, если целевой путь находится в начале строки)за ним следует захваченная группа из любого количества символов, за которой следует целевая литеральная строка «long_test.list», за которой следует любое количество символов, оканчивающихся двойной кавычкой. Замените все совпадение, если оно найдено, двойной кавычкой, за которой следует вторая группа захвата, за которой следует литерал «My_test.list», а затем закрывающая двойная кавычка. Если совпадение НЕ найдено, будет возвращена вся прочитанная строка.

#!/usr/bin/env python

import re

line = 'test_list="root/abc_test.list someText tests/long_test.list someText tests/h2.list"'

print(line)

line = re.sub(r'"(.* )?(.*)long_test.list.*"', r'"\2My_test.list"', line)

print(line)

$ ./test.py
test_list="root/abc_test.list someText tests/long_test.list someText tests/h2.list"
test_list="tests/My_test.list"
$ 
...