Используя python, как мне вставить строку в выделенные строки текстового файла, где вставленная строка зависит от содержимого строки и известного отображения? - PullRequest
1 голос
/ 05 февраля 2020

Фон

У меня есть текстовый файл (это файл DAT), который я хочу импортировать в отформатированную программу как есть, хотя с некоторыми дополнительными строками, вставленными для выбора строк. Файл слишком велик, чтобы вносить незначительные изменения вручную.

Произвольная строка выбора имеет следующие определяющие свойства:

  • начинается с select_string_, за которой следует уникальная строка $_, который можно обнаружить с помощью регулярного выражения.
  • заканчивается элементом следующего набора строк: {'string_A', 'string_B', 'string_ C'}

Для каждой строки выбора точная строка, которую я хочу вставить, зависит от того, какой из этих элементов строки появляется в конце строки, и от известного сопоставления.

(Строки без выбора содержат произвольные строки; они не отображаются в некотором простом порядке. Кстати, за всеми выбранными строками за указанной выше уникальной строкой $_ следует _blah_, который можно обнаружить с помощью регулярных выражений )

Итак, начиная со строки 1, мы имеем что-то вроде следующего:

select_string_$__blah_string_A
non_select_arbitrary_string
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$__blah_string_A
non_select_arbitrary_string
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$__blah_string_B
select_string_$__blah_string_B
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$__blah_string_C
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$__blah_string_C

Для данной строки выбора текст, который я хочу вставить, принадлежит после $_, и я хотите, чтобы указанная строка c была вставлена, чтобы отразить следующую простую (широко определенную) биективную функцию f :

f = {(string_A, f (строка_A)), (строка_B, f (строка_B)), (строка_ C, f (строка_ C)))

Следующий словарь фиксирует это отображение:

{'string_A' : '*f*(string_A)', 'string_B' : '*f*(string_B)', 'string_C' : '*f*(string_C)'}

Итак, возьмем string_A в качестве произвольного примера: во всех выбранных строках, заканчивающихся string_A, после $_ должна быть вставлена ​​f(string). Таким образом, я хочу, чтобы все выделенные строки, содержащие string_A, выглядели следующим образом:

select_string_$_f(string_A)_blah_string_A

Обобщая этот произвольный пример, я задаю следующий вопрос:

Вопрос

Используя python 3, как мне сгенерировать следующий текст?

select_string_$_f(string_A)_blah_string_A
non_select_arbitrary_string
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$_f(string_A)_blah_string_A
non_select_arbitrary_string
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$_f(string_B)_blah_string_B
select_string_$_f(string_B)_blah_string_B
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$_f(string_C)_blah_string_C
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$_f(string_C)_blah_string_C

В более общем случае: используя python, как вставить строку в отдельные строки текстового файла, где вставленная строка зависит от содержимого строки и известного отображения?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020
import re

fin = open("input.txt", "r")
fout = open("output.txt", "w")

for line in fin:
    line = re.sub(r'^(select_string_\$_)(.*?(string_A|string_B|string_C))$', r'\1f(\3)\2', line)
    fout.write(line)

Для вашего примера это дает:

select_string_$_f(string_A)_blah_string_A
non_select_arbitrary_string
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$_f(string_A)_blah_string_A
non_select_arbitrary_string
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$_f(string_B)_blah_string_B
select_string_$_f(string_B)_blah_string_B
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$_f(string_C)_blah_string_C
non_select_arbitrary_string
non_select_arbitrary_string
select_string_$_f(string_C)_blah_string_C

Объяснение регулярного выражения:

^                                   # beginning of line
  (select_string_\$_)               # group 1, literally "select_string_$_"
  (                                 # group 2
    .*?                             # 0 or more any character
    (string_A|string_B|string_C)    # group 3 one of string_A or string_B or string_C
  )                                 # end group 3
$                                   # end of line

Замена:

\1              # content of group 1
f(\3)           # f(, content of group 3, )  
\2              # content of group 2
0 голосов
/ 05 февраля 2020

Учитывая, что $_ является дополнительным индикатором во всех строках, которые вы хотите изменить sh, мы можем проверить наличие $_ и дополнительно проверить наличие string_a, b or c.

string_a = 'string_A'
string_b = 'string_B'
string_c = 'string_C'

testcases = ['select_string_$__blah_string_A', 'select_string_$__blah_string_B', 'select_string_$__blah_string_C', 'non_select_arbitrary_string']

result = []

for test in testcases:
    if '$_' not in test:
        result.append(test)
        continue

    check = test.split('$_')

    if string_a in check[1]:
        result.append(f'$_({string_a})'.join(check))
    elif string_b in check[1]:
        result.append(f'$_({string_b})'.join(check))
    elif string_c in check[1]:
        result.append(f'$_({string_c})'.join(check))

print(result)

#['select_string_$_(string_A)_blah_string_A', 'select_string_$_(string_B)_blah_string_B', 'select_string_$_(string_C)_blah_string_C', 'non_select_arbitrary_string']

Отсюда вы можете записать свой result обратно в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...