Регулярное выражение проверяет, сколько символов окружено пробелами

#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 или между ними, механизм регулярных выражений применяет эти условия в правильном положении.