Могу ли я использовать регулярное выражение Python для букв, тире и подчеркиваний? - PullRequest
1 голос
/ 21 августа 2011

Я хочу обработать географические названия, т. Е. / New_york или / new-york и т. Д. и так как new-york для django-slugify для New-york, то, возможно, мне следует использовать slugifed имена, даже если имена с подчеркиванием выглядят лучше, так как я могу захотеть автоматизировать создание URL с помощью такого алгоритма, как django slugify. Предполагается, что ([A-Za-z]+) или просто ([\w-]+) могут работать, но для безопасности я спрашиваю вас, какое регулярное выражение является лучшим выбором в этом случае. У меня уже есть регулярное выражение, которое обрабатывает числа, соединяющие числа с классом:

('/([0-9]*)',ById) # извлекает и отображает сущность по идентификатору

Теперь я хочу, чтобы другое регулярное выражение совпадало с именами, например, new_york, так что запрос на / new_york обрабатывается соответствующим обработчиком. По сути, отрицание приведенного выше регулярного выражения будет или любой комбинации букв + подчеркивание и, возможно, тире - так как имена географические, и, кажется, я мог бы использовать это регулярное выражение, но я считаю, что это работает только из-за того, что он принимает все:

('/(.*)', ByName) # Обрабатывать сущности instance / new_york, сущности / sao_paulo и т. Д. С помощью настраиваемого сопоставления для моих соответствующих мест.

Поскольку у меня есть другие обработчики, и я не хочу конфликтующих регулярных выражений, и у меня есть другие обработчики запросов, не могли бы вы порекомендовать, как сформулировать регулярное выражение?

Как это работает, когда выражение подходит для двух регулярных выражений? Который имеет более высокий приоритет? Можете ли вы рассказать мне больше, как я должен научиться писать регулярные выражения и возможные реализации для географического хранилища данных - в качестве сущностей или переменных экземпляра, а также особых проблем, таких как географические местоположения, которые имеют разные имена на разных языках, например, Немецкий по-немецки называется Deutschland, поэтому я также хочу применить переводы, которые я могу сделать с файлами gettext / djang.po.

1 Ответ

3 голосов
/ 21 августа 2011

выигрывает первый матч.

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

/cities/(?P<city>[^/]+)
/users/(?P<user>[^/]+)

и во многих случаях [^ /] + является хорошим регулярным выражением, потому что оно будет соответствовать всему, кроме /, чего вы обычно избегаете, потому что оно используется для разделения элементов пути.

Я не думаю, что это хорошая идея, чтобы разделять URL-адреса, основанные исключительно на символах (в вашем случае буквы или цифры), но если вы хотите сделать это, используйте [-A-Za-z_]+ (обратите внимание, что "-" идет в начало [], или требуется обратная косая черта).

избегайте \w, поскольку это также может соответствовать цифрам. если вы не хотите сходить с ума и отправлять цифры только одному обработчику, а буквы + цифры в другом месте, в этом случае используйте:

/(?P<id>\d+)
/(?P<city>[-\w]+)

в таком порядке.

...