re.split, чтобы разделить выражение и сохранить разделители / с включенными скобками - PullRequest
1 голос
/ 22 апреля 2019

Я работаю с несколькими выражениями, которые выглядят так C=>E или A+B+C=>D или A+B<=>C и (F|G)+H=>E. Я пытаюсь использовать re.split(), чтобы разделить на => или <=>. Кроме того, я хочу разделить 3 оператора + | ^, не касаясь того, что находится внутри скобок.

Первая попытка, я пробовал это

re.split(r"<=>|=>", "A+B+C=>D")

но проблема в том, что он разбивает строку вроде A+B+C=>D до

["A+B", "D"]

тогда как я пытаюсь достичь

["A+B", "=>", "D"]

, а также с проблемой, касающейся операторов, когда я пытаюсь разделить (A+B)|C=>D следующим образом

re.split(r"\+|=>|<=>|\^|\|", "(A+B)|C=>D")

Я получаю

["(A", "B)", "C", "D"]

тогда как я пытаюсь достичь

["(A + B)", "|", "C", "=>", "D"]

Я не очень хорошо разбираюсь в регулярных выражениях, поэтому мне нужна помощь с, возможно, регулярным выражением, достаточно надежным, чтобы сделать это за один раз. Если это невозможно с регулярным выражением, по крайней мере, лучший способ сделать это.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Вы можете использовать

re.findall(r'\([^()]*\)|<?=>|[-+/*|^]|\w+', s)

См. Демоверсию regex и график Regulex :

enter image description here

Подробности

  • \([^()]*\) - подстрока в скобках
  • | - или
  • <?=>- a <=> или =>
  • | - или
  • [-+/*|^] - один из символов, определенных в классе символов (для сопоставления с любым словом и без пробела)char, вы можете заменить его на [\w\s])
  • | - или
  • \w+ - слово в символах, 1 или более (вы можете указать это при необходимости: [A-Z]+будет соответствовать 1 или более заглавным буквам, [a-zA-Z]+ будет соответствовать 1+ буквам)
1 голос
/ 22 апреля 2019

Все, что вам нужно, это группа захвата:

import re

print(re.split(r"'(\^|=>)", "A+B+C=>D"))
# ['A+B+C', '=>', 'D']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...