#python #regex #python-3.x #escaping
#python #регулярное выражение #python-3.x #экранирование
Вопрос:
Я хочу читать регулярные выражения из файла, где каждая строка содержит регулярное выражение:
lorem.*
dolorS*
Предполагается, что следующий код считывает каждое из них и добавляет его в список строк регулярных выражений:
vocabulary=[]
with open(path, "r") as vocabularyFile:
for term in vocabularyFile:
term = term.rstrip()
vocabulary.append(term)
Похоже, что этот код экранирует
специальный символ в файле как \
. Как я могу избежать экранирования или отменить экранирование строки, чтобы с ней можно было работать так, как если бы я написал это?
regex = r"dolorS*"
Комментарии:
1. Это просто визуальная вещь, строка не экранируется. Проверьте, введя
r"dolorS*"
REPL (который затем также отображается'dolor\S*'
).2. Этот код экранирует специальный символ в файле как \ . Нет, это не так. Если вы повторяете значение, интерпретатор Python будет представлять значение,
'dolor\S*'
чтобы сделать его воспроизводимым, но это не одно и то же.3. Когда вы отображаете регулярное выражение, вы видите ‘\’, но это просто представление символа ». Имхо, ничего не нужно отменять.
4. Если вы повторите
regex
созданную вами строку примера, вы увидите, что она тоже экранируется при повторении.
Ответ №1:
Вы путаетесь, повторяя значение. Интерпретатор Python повторяет значения, печатая результат repr()
функции, и это гарантирует экранирование любых мета-символов:
>>> regex = r"dolorS*"
>>> regex
'dolor\S*'
regex
по-прежнему является строкой из 8 символов, а не 9, а единственный символ в индексе 5 представляет собой единственную обратную косую черту:
>>> regex[4]
'r'
>>> regex[5]
'\'
>>> regex[6]
'S'
При печати строки все символы записываются дословно, поэтому экранирование не выполняется:
>>> print(regex)
dolorS*
Тот же процесс применяется к содержимому контейнеров, таких как a list
или a dict
:
>>> container = [regex, 'foonbar']
>>> print(container)
['dolor\S*', 'foonbar']
Обратите внимание, что я не повторял там, я печатал. str(list_object)
выдает тот же результат, repr(list_object)
что и здесь.
Если вы должны были распечатать отдельные элементы из списка, вы снова получите тот же неэкранированный результат:
>>> print(container[0])
dolorS*
>>> print(container[1])
foo
bar
Обратите внимание, как n
во втором элементе теперь был записан символ новой строки. Именно по этой причине контейнеры используются repr()
для содержимого; чтобы сделать видимыми трудноопределимые или непечатаемые данные.
Другими словами, ваши строки здесь не содержат экранированных строк.