Использовать регулярное выражение в качестве замены в функции регулярных выражений?

#python #regex #python-3.x

#python #регулярное выражение #python-3.x

Вопрос:

Я пытаюсь использовать функцию регулярных выражений для достижения следующего: Мой ввод выглядит следующим образом:

 A:L1, A:K2, A:E3, A:A4, A:E5, A:H7,
,EHKKDH,6,LKEAELH,7
  

Я хотел бы написать функцию регулярных выражений, которая будет отделять

 ,EHKKDH,6,LKEAELH,7
to:
,EHKKDH,6,
 (blankline)
 LKEAELH,7
  

Функция, которая у меня есть для поиска того, что я хочу отделить, это:

 import re
with open ('masterfile.txt', 'r' ) as f:
content = f.read()
y=str(content)
badpattern= re.compile(r'd,w')
goodpattern=re.compile(r'd,nw')
x = re.sub(badpattern,goodpattern,y)
print(x)
  

Я получаю следующую ошибку, когда использую goodpattern в месте замены.

  File "myprogram.py", line 55, in <module>
x = re.sub(badpattern,goodpattern,y)
File "/Users/Jay/anaconda3/lib/python3.7/re.py", line 192, in sub
return _compile(pattern, flags).sub(repl, string, count)
File "/Users/Jay/anaconda3/lib/python3.7/re.py", line 309, in _subx
template = _compile_repl(template, pattern)
File "/Users/Jay/anaconda3/lib/python3.7/re.py", line 300, in 
_compile_repl
return sre_parse.parse_template(repl, pattern)
File "/Users/Jay/anaconda3/lib/python3.7/sre_parse.py", line 954, in parse_template
s = Tokenizer(source)
File "/Users/Jay/anaconda3/lib/python3.7/sre_parse.py", line 228, in __init__
string = str(string, 'latin1')
TypeError: decoding to str: need a bytes-like object, re.Pattern found
  

Мой код работает иначе, если я помещаю строку ‘works’, где goodpattern, я получаю следующий вывод:

 ,EHKKDH,worksKEAELH,7
  

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

Также, как бы я добавил эти изменения, чтобы заменить совпадения в исходном файле? Я понимаю метод replace. Тем не менее, я испытываю ужасные трудности с использованием re.sub даже после ознакомления с руководством. Я ценю помощь!

Ответ №1:

Я обычно использую сайт regexr.com для создания такого рода регулярных выражений.

В любом случае, как вы сказали, шаблон является word , number , .

Меняем это на регулярное выражение:

word -> w или [a-zA-Z] ( w также будет включать числа, [a-zA-Z] будут соответствовать только символам A to Z и a to z . Вы добавляете , чтобы соответствовать хотя бы одному символу.)

, -> ,

number -> d

Тогда конечное регулярное выражение будет [a-zA-Z] ,d , .

Ответ №2:

Второй параметр для re.sub , строка замены, должен быть строкой, а не другим регулярным выражением. В вашем случае вам следует использовать группы захвата до и после того, как вы хотите вставить символ новой строки (или два, если вам нужна пустая строка), чтобы вы могли использовать обратные ссылки для ссылки на них в строке замены:

 x = re.sub(r'(d,)(w)', r'1n2', y)
  

Комментарии:

1. Спасибо за выражение регулярных выражений. Я очень ценю это. Я немного запутался в том, что именно представляют собой группы захвата. если я добавлю строку с надписью print (x) после регулярного выражения, вывод, который я хочу, появится в окне терминала. Как мне добавить это к исходящему файлу? Я попробовал f.write () и получил ввод-вывод. Неподдерживаемая операция: недоступна для записи

2. Рад быть полезным. Ваш выходной файл должен быть открыт в режиме, доступном для записи. Например, outfile = open('output.txt', 'w') .