Я пытаюсь сопоставить любую из следующих строк с регулярным выражением в python:
RAA RAA
RAA RAA / OOO OOO
RAA RAA / OOO OOO / ROCKY
Эти строки всегда должны быть в отдельной строке, поэтому RAA RAA moves over there.
не будет соответствовать.
Я придумал это регулярное выражение, используя RegExr:
^([A-Z]*([ ]?)*([A-Z]?)*([ \/]?)*)*$
Это отлично работает, чтобы соответствовать всем различным строкам, однако он заставляет python зависать, если он пытается сопоставить RAA RAA moves over there.
Я понятия не имею, почему. Есть ли специалисты по регулярному выражению, которые могут иметь некоторое понимание?
Весь ваш шаблон заполнен необязательными совпадениями, что, вероятно, приводит к большому количеству обратного отслеживания и, следовательно, к повешению. Попробуйте использовать обязательное соответствие, где это имеет смысл, например:
^([A-Z]+([ ]?)+([A-Z])*([ /])*)*$
Более чистый шаблон без ненужных групп захвата будет выглядеть следующим образом:
^([A-Z]+[ ]?)+([A-Z]+[ /]*)*$
Обратите внимание, что использование +
вместо *
гарантирует совпадение хотя бы одного символа, вместо того, чтобы сделать весь шаблон необязательным и обменивать движок регулярных выражений.
Это регулярное выражение является слишком общим: оно не только больше, чем вам нужно, но оно имеет так много *
, что регулярный повторитель постоянно будет бесцельно отступать, чтобы попробовать другую комбинацию. Я не пытался работать с комбинаторным деревом, но он по крайней мере несколько тысяч попыток за несогласованную строку.
Конкретнее лучше, и убедитесь, что вы больше не возвращаетесь к тому, что вы сделали, чтобы лучше:
^RAA RAA(?: \/ OOO OOO(?: \/ ROCKY)?)?$
Если подстроки не являются константами, вы должны указать их как можно полнее, чтобы избежать ненужного возврата.
(?:
- еще одна небольшая оптимизация: не записывайте совпадающие совпадения для последующего извлечения. Если вам понадобятся подстроки, я думаю, вы не хотите с ними /
, так что захватите только части, которые вы хотите.)
*
подразумевают?
(например,([ ]?)*
is\ *
без обратной косой черты, которую я был вынужден включить, потому что уценка иногда слишком старается, чтобы не затемнять текст без пометки).