#python #python-3.x #regex
#python #python-3.x #регулярное выражение
Вопрос:
Есть строки, которые должны обрабатываться функцией, и весь процесс выглядит так:
surrounding_characters = ["n", "t", "r"]
input_string = "nTt tEtnSnrTt"
_s = "".join(surrounding_characters)
pattern = re.compile(rf"([sS])(?<=[{_s}])(?=[{_s}])")
print(re.findall(pattern, input_string))
## ['t', 'n']
Я скорее ожидал увидеть ['T', ' ', 'E', 'S', 'T']
в качестве вывода, потому что каждый из этих символов окружен символами пробела. Удаление первой группы из шаблона и оставление ее как [sS]
не изменяет поведение метода.
Как заставить его работать должным образом?
Комментарии:
1. Посмотрите,
([sS])(?<=[rtn])
означает любой символ, равный CR, LF или TAB . Он соответствует только этим трем символам.
Ответ №1:
Вы используете [sS]
не в том месте. Оно должно быть помещено между утверждениями lookbehind и lookahead:
>>> surrounding_characters = ["n", "t", "r"]
>>> input_string = "nTt tEtnSnrTt"
>>> _s = "".join(surrounding_characters)
>>> pattern = re.compile(rf"(?<=[{_s}])[sS](?=[{_s}])")
>>> print (re.findall(pattern, input_string))
['T', ' ', 'E', 'S', 'T']
Обратите внимание, что вы также можете использовать однострочный модификатор (?s)
здесь с .
:
>>> pattern = re.compile(rf"(?s)(?<=[{_s}]).(?=[{_s}])")
Когда вы размещаете .
[sS]
условие lookbehind и lookahead или между ними, механизм регулярных выражений применяет эти условия в правильном положении.