Выражение в регулярном выражении python - PullRequest
0 голосов
/ 09 мая 2020

Я хотел бы создать регулярное выражение для форматирования текста, в котором не может быть символа {, кроме случаев, когда он идет с backsla sh \ позади. Проблема в том, что backsla sh может ускользнуть от себя, поэтому я не хочу, например, совпадать с \\{, но мне нужен \\\{. Поэтому мне нужно только нечетное количество обратных косых черт перед {. Я не могу просто взять его в группу и найти количество обратных косых черт после следующего, например:

s = r"a wei\\\{rd thing\\\\\{"
matchs = re.finditer(r"([^\{]|(\\+)\{)+", s)
for match in matchs:
    if len(match.group(2)) / 2 == len(match.group(2)) // 2: # check if it's even
        continue
    do_some_things()

Поскольку группа 2 может использоваться более одного раза, поэтому я могу получить доступ только к последнее (в данном случае \\\\\) Было бы очень хорошо, если бы мы могли просто сделать что-то вроде "([^\{]|(\\+)(?if len(\2) / 2 == len(\2) // 2)\{)+" как регулярное выражение, но, насколько я знаю, это невозможно. Как тогда сделать ???

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Соответствует нечетному количеству обратных косых черт, за которыми следует фигурная скобка:

(?<!\\)(\\\\)*(\\\{)

Разбивка:

  • (?<!\\) - без обратной косой черты sh, чтобы учесть следующий бит
    • Это называется «отрицательный просмотр назад»
  • (\\\\)* - ноль или более пар обратных косых черт
  • (\\\{) - обратная косая черта sh затем фигурная скобка

Соответствует:

\{
\\\{
\\\\\{

Несоответствия:

\\{
\\\\{
\\\\\\{

Попробуйте RegExr


Это частично навеяно Вадимом Бараташвили ответом

0 голосов
/ 09 мая 2020

Я думаю, вы можете использовать этот в качестве решения: ([^\\](\\\\){0,})(\{)

Мы можем проверить, что между последним символом, который не является backsla sh, есть 0 или более пар обратная косая черта, а затем идет {если часть текста соответствует шаблону, то мы можем заменить ее первой группой $1 (символ, который не является sla sh плюс 0 или более пар косых черт), поэтому мы найдем и заменить неэкранированный {.

Если мы хотим найти экранированный {, мы можем использовать это выражение: ([^\\](\\\\){0,})(\\\{) - вторая группа совпадений \{

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...