Python регулярное выражение поиска и замены всех символов после строки - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь сделать что-то, что мне показалось простым, но у меня возникли проблемы с регулярным выражением. В частности, я хочу найти CAUGHT AN ERROR и все после него в одной строке и заменить его на CAUGHT AN ERROR: XXXXX. Насколько я понимаю, использование .*$ ( пример ) позволит мне искать до конец строки, но я не получаю точную замену, используя для l oop. Как я могу заменить все после символов, которые я ищу?

1970-01-01 10:59:02     
1970-01-01 10:59:02    
1970-01-01 10:59:01    CAUGHT AN ERROR: rmv: cannot remove '/media/^Red^XXXXXX.jpg': No such file or directory; FROM: exec rm [file join $drive $newFile] (in USB::Write /)
1970-01-01 10:59:01    CAUGHT AN ERROR: rmv: cannot remove '/media/^Green^XXXXXX.jpg': No such file or directory; FROM: exec rm [file join $drive $newFile] (in USB::Write /media/ug)
1970-01-01 10:59:02    CAUGHT AN ERROR: rmv: cannot remove '/media/^Blue^XXXXXX.jpg': No such file or directory; FROM: exec rm [file join $drive $newFile] (in USB::Write /medi0349223^BradbuXXXXXX.jpg)
1970-01-01 10:59:02    CAUGHT AN ERROR: rmv: cannot remove '/media/^XXXXXX.jpg': No such file or directory; FROM: exec rm [file join $drive $newFile] (in USB::Write /media/usb0 XXXXXX.jpg)
1970-01-01 10:59:02    CAUGHT AN ERROR: rmv: cannot remove '/media/^Orange^XXXXXX.jpg': No such file or directory; FROM: exec rm [file join $drive $newFile] (in USB::Write )
1970-01-01 10:59:02  

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

with open(r'C:\Users\Downloads\LOG\sample.log', mode='r', encoding='utf8') as log_r:
    content = log_r.read()

dict_items = {r'CAUGHT AN ERROR: [A-Z|a-z|0-9|\.|\-|\,|\_|\{|\}|\)|\(|\/]*\+': r'CAUGHT AN ERROR: XXXXXX'}

for k, v in dict_items.items():
    content = re.sub(k, v, content)

print(content)

В моем словаре я также пытался, но безрезультатно.

r'CAUGHT AN ERROR: .\$'
r'CAUGHT AN ERROR: .*$'

Ожидаемый результат

1970-01-01 10:59:02     
1970-01-01 10:59:02    
1970-01-01 10:59:01    CAUGHT AN ERROR: XXXXXX
1970-01-01 10:59:01    CAUGHT AN ERROR: XXXXXX
1970-01-01 10:59:02    CAUGHT AN ERROR: XXXXXX
1970-01-01 10:59:02    CAUGHT AN ERROR: XXXXXX
1970-01-01 10:59:02    CAUGHT AN ERROR: XXXXXX
1970-01-01 10:59:02  

1 Ответ

0 голосов
/ 19 марта 2020

r'CAUGHT AN ERROR: .*$' - правильное регулярное выражение. Но вам нужно использовать флаг re.MULTILINE, чтобы $ совпадал с концом строк, а не с концом всей строки.

dict_items = {r'CAUGHT AN ERROR: .*$': r'CAUGHT AN ERROR: XXXXXX'}
for k, v in dict_items.items():
    content = re.sub(k, v, content, flags=re.MULTILINE)

print(content)

DEMO

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