Проблема регулярного выражения Python

1

Я пытаюсь сопоставить любую из следующих строк с регулярным выражением в 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.

Я понятия не имею, почему. Есть ли специалисты по регулярному выражению, которые могут иметь некоторое понимание?

  • 0
    Определите «зависания» - как долго вы ждете? Также обратите внимание, что классы символов с одним символом избыточны и * подразумевают ? (например, ([ ]?)* is \ * без обратной косой черты, которую я был вынужден включить, потому что уценка иногда слишком старается, чтобы не затемнять текст без пометки).
  • 4
    Вы просто пытаетесь сопоставить строки, состоящие только из заглавных букв, косой черты и пробелов? Мне непонятно, какое имущество вы ищете?
Показать ещё 2 комментария
Теги:

2 ответа

0
Лучший ответ

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

^([A-Z]+([ ]?)+([A-Z])*([ /])*)*$

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

^([A-Z]+[ ]?)+([A-Z]+[ /]*)*$

Обратите внимание, что использование + вместо * гарантирует совпадение хотя бы одного символа, вместо того, чтобы сделать весь шаблон необязательным и обменивать движок регулярных выражений.

  • 0
    Это определенно то, что мне нужно. Мои навыки регулярных выражений крайне неадекватны, поэтому этот совет очень ценится.
2

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

Конкретнее лучше, и убедитесь, что вы больше не возвращаетесь к тому, что вы сделали, чтобы лучше:

^RAA RAA(?: \/ OOO OOO(?: \/ ROCKY)?)?$

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

(?: - еще одна небольшая оптимизация: не записывайте совпадающие совпадения для последующего извлечения. Если вам понадобятся подстроки, я думаю, вы не хотите с ними /, так что захватите только части, которые вы хотите.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню