Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2018 20:47:26

Endore
Зарегистрирован: 2018-01-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование модуля re для замены всех несовпадений

Уж извините, второй раз за день В этот раз все проверил, из того что понимал.
Читаю про модуль re для замены им awk и sed. Интересует один момент - замена того, что не совпадает с паттерном. Пример:
Исходный файл:

12345678
12345678
wer
111111111111111111111111111111111111111111
99999
wer2
aj;df;sdf
afsdf
sdfsdfsdfsdfsdf
1
2
3
###############
@#@*&#^@(*#^@(*#
!!!!!!!!!!!!(((
adfsfaваыаываУУКУКУК
ыва23$$3ddddd
Мой скрипт:
 import re
allowed = list("123")
src = 'test'
with open(src) as f:
    for lines in f.readlines():
        new = re.sub('[^allowed]', "*", lines)
        print(new.replace('\n', ''))
print(allowed)
По идее, все символы, не совпадающие с 1, 2 или 3 должны быть заменены на “*”. Однако я получаю:
*********
*********
we**
*******************************************
******
we***
a**d***d**
a**d**
*d**d**d**d**d**
**
**
**
****************
*****************
****************
ad***a***************
********ddddd*
['1', '2', '3']
что совсем не вяжется с указанным паттерном. Попробовал так же без файла, с простым списком - результат тот же. Какая-то часть символов, которая не совпадает с паттерном все равно не меняется и что еще более странно, заменяются разрешенные символ. При этом, если вместо списка паттерн указывать первым аргументом в re.sub, то все отлично меняет. Как это можно объяснить? Список вроде правильно объявлен, и похожие примеры с regex я видел (где список в виде разрешенных элементов).

Отредактировано Endore (Янв. 20, 2018 20:48:04)

Офлайн

#2 Янв. 20, 2018 21:03:20

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Использование модуля re для замены всех несовпадений

ты создаешь паттерн, неправильно.

 new = re.sub('[^allowed]', "*", lines)
allowed в данном случае строка, а не переменная. Как вариант можешь сделать так:
 new = re.sub('[{}]'.format(allowed), "*", lines)

Офлайн

#3 Янв. 20, 2018 21:12:51

Endore
Зарегистрирован: 2018-01-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование модуля re для замены всех несовпадений

Romissevd
ты создаешь паттерн, неправильно.
Спасибо, идею понял, но:
  import re
allowed = list("123")
src = 'test'
with open(src) as f:
    for lines in f.readlines():
        new = re.sub('[^{}]'.format(allowed), "*", lines)
        print(new.replace('\n', ''))
выдает
12345678
12345678
wer
111111111111111111111111111111111111111111
99999
wer2
aj;df;sdf
afsdf
sdfsdfsdfsdfsdf
1
2
3
###############
@#@*&#^@(*#^@(*#
!!!!!!!!!!!!(((
adfsfaваыаываУУКУКУК
ыва23$$3ddddd
Т.е. вообще ничего не меняется.

Отредактировано Endore (Янв. 20, 2018 21:14:16)

Офлайн

#4 Янв. 20, 2018 21:38:18

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Использование модуля re для замены всех несовпадений

 import re
allowed = "123"
src = 'test'
with open(src) as f:
    for lines in f.readlines():
        new = re.sub('[{}]'.format(allowed), "*", lines)
        print(new.replace('\n', ''))

Офлайн

#5 Янв. 20, 2018 21:43:56

Endore
Зарегистрирован: 2018-01-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование модуля re для замены всех несовпадений

Romissevd
ааа, вот оно что. Значит списки нельзя использовать в качестве паттерна. Теперь понятно, спасибо большое!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version