2014-10-15 3 views
4

Мне нужно регулярное выражение, которое принимает только символы с акцентами. На данный момент я использую этот:Регулярное выражение, которое принимает только символы с акцентами

[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûüýþÿ]*$ 

Есть ли другое выражение, которое яснее моего выражения?

+1

Это одна на самом деле выглядит довольно хорошо. –

+0

Возможное решение может заключаться в использовании кодов для этих символов ... –

+1

Вы должны включить якорь '^' в начале (чтобы вы не просто соответствовали концу строки), а вместо '+' вместо ' '*', если вы не хотите сопоставить пустую строку. –

ответ

1

я думаю, что это решит вашу проблему:

[œÀ-ÖØ-öø-ÿ]*$ 
1

Regex не всегда является самым ясным способом обработки текста, даже если он самый быстрый.

Вы можете присвоить регулярное выражение переменной, а затем вставить его с помощью текста интерполяции:

accent_chars = '[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûüýþÿ]' 

my_regex = '^...%s*...$' % accent_chars 

Вы можете также использовать эти диапазоны:

[œÀ-ÖØ-öø-ÿ] 

Демонстрация с использованием Python 3:

>>> import re 
>>> s = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûüýþÿ' 
>>> ''.join(re.findall('[œÀ-ÖØ-öø-ÿ]', s)) 
'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûüýþÿ' 
>>> len(''.join(re.findall('[œÀ-ÖØ-öø-ÿ]', s))) == len(s) 
True 

Недостатком является то, что не сразу понятно кому-то незнакомому с Unic что это охватывает каждый желаемый случай.

0

Вы также можете попробовать использовать POSIX bracket expression [: alpha:].

Затем просто обрезайте алфавитные символы из своей строки.

+1

Некоторые реализации регулярных выражений поддерживают [вычитание символьного класса] (http://www.regular-expressions.info/charclasssubtract.html), что означает, что следующее может работать в зависимости от конкретной ситуации OP: '[[: alpha:] - [a -zA-Z]] ' –

+0

Это может сравниться с тем, что требуется OP в режиме Unicode, и не соответствует потребностям символа OP в режиме ASCII. И в зависимости от языка/библиотеки/режима регулярное выражение может соответствовать символу на основе языка, и поведение может быть совершенно иным. Не рекомендуется использовать класс символов POSIX, если вы хотите совместить с ним определенное подмножество символов. – nhahtdh

1

Поскольку все символы, кроме œ, находятся между символами 192 À и 255 ÿ, не могли бы вы сделать что-то вроде поиска вперед и проверки, что они не содержат никаких символов в диапазоне, который вы не хотите? Я не уверен, что это улучшает что-либо по сравнению с вашим, но немного короче и, может быть, просто, может быть, яснее.

(?![÷×])[À-ÿœ] 
+1

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

+1

Смотрище предназначено для '(?! [÷ ×])'? Или как насчет '[À-ÖØ-öø-ÿ]' плюс для идеи :) –

+0

О да, я написал это по телефону (это тоже) спасибо! –

Смежные вопросы