#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')
.