Jeśli bardzo martwiłeś się znakami narodowymi i precyzyjnym traktowaniem klas znaków Unicode, to jedynym rozwiązaniem, jakie udało mi się do tej pory znaleźć, jest regex
biblioteka Python . Zarówno grep
i Perl
(ku mojemu zdziwieniu!) Nie wykonali poprawnie tej pracy.
Tak więc wyrażenie regularne jesteś po to jest jeden: \p{L}
. Jest to znane jako wersja skrócona właściwości Unicode, pełna wersja jest \p{Letter}
lub nawet p\{General_Category=Letter}
. Letter
sam w sobie jest klasą złożoną, ale nie będę wchodził w szczegóły, najlepsze referencje, jakie mogłem znaleźć na ten temat, są tutaj .
Biblioteka języka Python nie jest wbudowana w język (jest alternatywą dla re
biblioteki wbudowanej ). Więc musisz go zainstalować, na przykład:
# pip install regex
Następnie możesz użyć go w następujący sposób:
import regex
>>> regex.match(ur'\p{L}+', u'۱۲۳۴۵۶۷۸۹۰')
>>> regex.match(ur'\p{L}+', u'абвгд')
<regex.Match object; span=(0, 5), match=u'\u0430\u0431\u0432\u0433\u0434'>
>>> regex.match(ur'\p{L}+', u'123')
>>> regex.match(ur'\p{L}+', u'abcd')
<regex.Match object; span=(0, 4), match=u'abcd'>
>>>
Możesz także umieścić ten skrypt gdzieś, gdzie możesz uzyskać do niego dostęp:
#!/usr/bin/env python
import regex
import sys
if __name__ == "__main__":
for match in regex.finditer(ur'\p{L}+', sys.argv[1].decode('utf-8')):
print match.string
I tak to nazwij Emacsem (załóżmy, że zapisałeś ten skrypt ~/bin
):
(defun unicode-character-p ()
(interactive)
(let* ((current (char-after (point)))
(result (shell-command-to-string
(format "~/bin/is-character.py '%c'" current))))
(message
(if (string= result "") "Character %c isn't a letter"
"Character %c is a letter")
current)))
۱۲۳۴۵۶۷۸۹۰
ale istnieją pewne prawdziwe negatywy, np. Arabski lub hebrajski Alef:א
,ا
.