Добавить новую строку после регулярного выражения - PullRequest
0 голосов
/ 08 января 2019

Я хочу добавлять новую строку каждый раз, когда моя программа находит регулярное выражение. Я хочу сохранить регулярное выражение, и после него начинается только новая строка. Текст читается из файла .txt. Я могу найти регулярное выражение, но когда я пытаюсь добавить новую строку, он возвращается, как показано ниже, в Фактический вывод . Я пытался исправить это в течение нескольких часов и был бы рад помочь.

Вот краткий пример:

В

STLB 1234 444 text text text
STLB 8796 567 text text text

РЕДАКТИРОВАТЬ В:

STLB 1234 444text text text

STLB 8796 567text text text

Требуемый выход:

STLB 1234 444
text text text
STLB 8796 567
text text text

Фактический результат:

(STLB.*\d\d\d) 

(STLB.*\d\d\d) 

Вот мой код:

stlb_match = re.compile('|'.join(['STLB.*\d\d\d']))

with open(in_file5, 'r', encoding='utf-8') as fin5, open(out_file5, 'w', encoding='utf-8') as fout5:
    lines = fin5.read().splitlines()

    for i, line in enumerate(lines):
        matchObj1 = re.match(start_rx, line)

        if not matchObj1:
            first_two_word = (" ".join(line.split()[:2]))

            if re.match(stlb_match,line):
                line =re.sub(r'(STLB.*\d\d\d)', r'(STLB.*\d\d\d)'+' \n', line)
            elif re.match(first_two_word, line):
                line = line.replace(first_two_word, "\n" + first_two_word)

        fout5.write(line)

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Если строки всегда имеют такой формат STLB <number> <number> <text>, это сработает:

код

with open(in_file5, 'r', encoding='utf-8') as fin5, open(out_file5, 'w', encoding='utf-8') as fout5:
    for l in fin5:
      l = re.sub(r'(STLB\s*\d+\s*\d+)\s*', r'\1\n', l)

      fout5.write(l)
      fout5.write('\n')

Input

STLB 1234 444 text text text
STLB 8796 567 text text text

выход

STLB 1234 444
text text text

STLB 8796 567
text text text

Обратите внимание на \s* в конце RegEx, но группа захвата заканчивается раньше, поэтому эти конечные пробелы не учитываются.

Использование понимания списка и writelines

with open(in_file5, 'r', encoding='utf-8') as fin5, open(out_file5, 'w', encoding='utf-8') as fout5:
    fout5.writelines([re.sub(r'(STLB\s*\d+\s*\d+)\s*', r'\1\n', l) for l in fin5])

Дайте мне знать, если это работает для вас

0 голосов
/ 08 января 2019

Ваша запасная часть неверна, вы не можете вставить в нее регулярное выражение. Изменить на:

line = 'STLB 1234 444 text text text'
line = re.sub(r'(STLB.*\d\d\d)', r"\1\n", line)
print line

Выход:

STLB 1234 444
 text text text

Или:

line = re.sub(r'(STLB.*\d\d\d) ', r"\1\n", line)

если вы хотите удалить пробел в начале второй строки

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