Python - как добавить новую строку каждый раз, когда шаблон найден в строке? - PullRequest
0 голосов
/ 23 ноября 2018

Как добавить новую строку каждый раз, когда в строке обнаруживается шаблон списка регулярных выражений?

Я использую python 3.6.

Я получилследующий ввод:

12.13.14 Здесь предполагается начать новую строку.

12.13.15 Здесь предполагается начать новую строку.

Здесьнекоторый текст.Это написано в одной строке.12,13.Вот еще немного текста.2.12.14.Вот еще больше текста.

Я хочу получить следующий вывод:

12.13.14

Здесь предполагается начать новую строку.

12.13.15

Здесь предполагается начать новую строку.

Вот текст.Это написано в одной строке.

12.13.

Вот еще немного текста.

2.12.14.

Вот еще больше текста.

Моя первая попытка возвращает в качестве выходных данных то же, что и ввод:

in_file2 = 'work1-T1.txt'
out_file2 = 'work2-T1.txt'


start_rx = re.compile('|'.join(
    ['\d\d\.\d\d\.', '\d\.\d\d\.\d\d','\d\d\.\d\d\.\d\d']))


with open(in_file2,'r', encoding='utf-8') as fin2, open(out_file2, 'w', encoding='utf-8') as fout2:
    text_list = fin2.read().split()
    fin2.seek(0)

    for string in fin2:
        if re.match(start_rx, string):
            string = str.replace(start_rx, '\n\n' + start_rx + '\n')

        fout2.write(string)

Myвторая попытка возвращает ошибку 'Ошибка типа: неподдерживаемые типы операндов для +:' _sre.SRE_Pattern 'и' str ''

in_file2 = 'work1-T1.txt'
out_file2 = 'work2-T1.txt'


start_rx = re.compile('|'.join(
            ['\d\d\.\d\d\.', '\d\.\d\d\.\d\d','\d\d\.\d\d\.\d\d']))

with open(in_file2,"r") as fin2, open(out_file2, 'w') as fout3:
    for line in fin2:
        start = False
        if re.match(start_rx, line):
            start = True
        if start == False:
            print ('do something')
        if start == True:
            line = '\n' + line ## leerzeichen vor Pos Nr
            line = line.replace(start_rx, start_rx + '\n')
        fout3.write(line)

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Прежде всего, для поиска и замены регулярным выражением необходимо использовать re.sub, а не str.replace.

Во-вторых, если вы используете re.sub, вы не можете использоватьШаблон регулярного выражения в шаблоне замены, вам необходимо сгруппировать части регулярного выражения, которые вы хотите сохранить, и использовать обратные ссылки при замене (или, если вы просто хотите сослаться на все совпадение, используйте обратную ссылку \g<0>, группы захвата не используются.требуется).

В-третьих, когда вы строите неисследованный шаблон чередования, сначала убедитесь, что альтернативы более длинные, т. е. start_rx = re.compile('|'.join(['\d\d\.\d\d\.\d\d', '\d\.\d\d\.\d\d', '\d\d\.\d\d\.'])).Однако вы можете использовать здесь более точный шаблон вручную.

Вот как ваш код может быть исправлен:

with open(in_file2,'r', encoding='utf-8') as fin2, open(out_file2, 'w', encoding='utf-8') as fout2:
    text = fin2.read()
    fout2.write(re.sub(r'\s*(\d+(?:\.\d+)+\.?)\s*', r'\n\n\1\n', text))

См. Python demo

Шаблон

\s*(\d+(?:\.\d+)+\.?)\s*

См. regex demo

Подробности

  • \s* -0+ пробелов
  • (\d+(?:\.\d+)+\.?) - группа 1 (\1 в шаблоне замены):
    • \d+ - 1+ цифр
    • (?:\.\d+)+ - 1 илибольше повторений . и 1+ цифр
    • \.? - необязательно .
  • \s* - 0+ пробелов
0 голосов
/ 23 ноября 2018

Попробуйте это

out_file2=re.sub(r'(\d+) ', r'\1\n', in_file2)
out_file2=re.sub(r'(\w+)\.', r'\1\.\n', in_file2)
...