Регулярное выражение PCRE в Python

309 просмотра
0
0 Комментариев

Я написал регулярное выражение на PCRE:

(\`|qx\[|qx\{).*(\`|\]|\})

Оно должно парсить строку внутри обратных кавычек (или указанных альтернатив). На Python 2.7 отрабатывает не так, как хотелось бы.

expression = re.compile('''(\`|qx\[|qx\{).+(\`|\]|\})''')
result = expression.findall('`   12  $`')

Вместо искомой строки получаю:

[('`', '`')]

Почему так происходит?


Добавить комментарий

2 Answers

Python Опубликовано 14.12.2018
0

Обратитесь к официальной документации: https://docs.python.org/3/library/re.html#re.findall (для версии 2.7 метод ведет себя так же)

Там написано: If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Т.е., если в выражении присутствуют группы, findall() вернет список групп, что он и делает в вашем случае. Используйте search() или match(), например

>>> result = expression.search('`   12  $`')
>>> result.group(0)
'`   12  $`'
>>> result.group(1)
'`'
>>> result.group(2)
'`'

Также, используйте r перед строкой с выражением, чтобы избежать возможной обработки Python, чтобы строка осталась ‘как есть’.

r'(\`|qx\[|qx\{).+(\`|\]|\})'

Добавить комментарий
0

import re
pattern = re.compile(r"(`[^`\[\]{}]+`|qx\[[^`\[\]{}]+\]|qx\{[^`\[\]{}]+\})")
print pattern.findall(" `text`, qx[text], qx{text}, а также qx[text` и qx{text]")

Вернет

['`text`', 'qx[text]', 'qx{text}']

Внутри ограничителей не пропускает символы: апостроф, [, ], {, }.

В вашем же варианте достаточно сделать группы без обратной связи

import re
expression = re.compile('''(?:\`|qx\[|qx\{).+(?:\`|\]|\})''')
print expression.findall('`   12  $`')

Результат

['`   12  $`']

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up