Python нежадный regexes

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

e.add(new Car(  0, 63, 2, new Color(1.0f,1.0f,1.0f, 1.0)));
e.add(new Car(  0, 63, 2, new Color(1.0f,1.0f,1.0f, 1.0)));

В этом случае происходит столкновение, но оно никогда не будет обнаружено, поскольку два объекта с помощью реализованного метода equals одинаковы.

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

Более того, как говорит @Jason, чтобы правильно зафиксировать столкновение, вы должны вычислить длину или ширину объекта.

133
задан AndersTornkvist 24 October 2011 в 21:12
поделиться

7 ответов

Вы ищете всесильного '*?'

http://docs.python.org/3 /howto/regex.html#greedy-versus-non-greedy

the не жадные квалификаторы * ?, + ?, ?? или {m, n}? [...] соответствует так же мало текст , насколько это возможно.

171
ответ дан 24 November 2019 в 00:01
поделиться

Не будет \\ (. *? \\) работа? Это не жадный синтаксис.

14
ответ дан 24 November 2019 в 00:01
поделиться
>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'

Согласно документам :

квалификаторы « * », « + » и «? » являются жадными; они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE <. *> сопоставлено с '

title ', оно будет соответствовать всей строке, а не только '

. Добавление '? ' после того, как квалификатор заставляет его выполнить совпадение не жадным или минимальным образом; будет сопоставлено как можно меньше символов. Использование . *? в предыдущем выражении будет соответствовать только '

'.

62
ответ дан 24 November 2019 в 00:01
поделиться

Как говорили другие, используя? модификатор в квантификаторе * решит вашу непосредственную проблему, но будьте осторожны, вы начинаете уходить в области, где регулярные выражения перестают работать, и вместо этого вам нужен синтаксический анализатор. Например, строка «(foo (bar)) baz» вызовет у вас проблемы.

5
ответ дан 24 November 2019 в 00:01
поделиться

Хотите, чтобы оно совпадало с "(b)"? Делай, как предложили Цитракс и Паоло. Вы хотите, чтобы это соответствовало "b"? Выполните

>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
3
ответ дан 24 November 2019 в 00:01
поделиться

Использование неадекватного матча - хорошее начало, но я бы также посоветовал вам пересмотреть любое использование . * - что по этому поводу?

groups = re.search(r"\([^)]*\)", x)
4
ответ дан 24 November 2019 в 00:01
поделиться

Прежде всего, я не предлагаю использовать "*" в regexes. Да, я знаю, это - наиболее используемый мультисимвольный разделитель, но это - тем не менее, плохая идея. Это вызвано тем, что, в то время как это действительно соответствует любому объему повторения для того символа, "любой" включает 0, который обычно является чем-то, для чего Вы хотите бросить синтаксическую ошибку, не принять. Вместо этого я предлагаю использовать эти + знак, который соответствует любому повторению длины> 1. Кроме того, от того, что я вижу, Вы имеете дело с заключенными в скобки выражениями фиксированной длины. В результате можно, вероятно, использовать {x, y} синтаксис для специфического определения желаемой длины.

Однако, если Вам действительно нужно нежадное повторение, я предлагаю консультироваться со всесильным ?. Это при размещении после в конце любого regex спецификатора повторения вынудит ту часть regex найти наименьшее количество суммы текста возможным.

Однако я был бы очень осторожен с ? как он, как Звуковая Отвертка в Докторе, Которого, имеет тенденцию сделать, как я должен поместить его, "немного" нежелательные вещи если не тщательно калиброванный. Например, для использования входа в качестве примера это определило бы ((1) (отметьте отсутствие второго rparen) как соответствие.

0
ответ дан 24 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: