Найти - Пользователи
Полная версия: Использование модуля re для замены всех несовпадений
Начало » Python для новичков » Использование модуля re для замены всех несовпадений
1
Endore
Уж извините, второй раз за день В этот раз все проверил, из того что понимал.
Читаю про модуль 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 я видел (где список в виде разрешенных элементов).

Romissevd
ты создаешь паттерн, неправильно.
 new = re.sub('[^allowed]', "*", lines)
allowed в данном случае строка, а не переменная. Как вариант можешь сделать так:
 new = re.sub('[{}]'.format(allowed), "*", lines)
Endore
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
Т.е. вообще ничего не меняется.
Romissevd
 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', ''))
Endore
Romissevd
ааа, вот оно что. Значит списки нельзя использовать в качестве паттерна. Теперь понятно, спасибо большое!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB