Jika Anda sangat prihatin tentang karakter nasional dan perlakuan tepat terhadap kelas karakter Unicode, maka satu-satunya solusi yang saya dapat temukan sejauh ini adalah regex
pustaka Python . Keduanya grep
dan Perl
(mengejutkan saya!) Tidak melakukan pekerjaan dengan benar.
Jadi, ekspresi reguler Anda setelah satu ini: \p{L}
. Ini dikenal sebagai versi steno properti Unicode, versi lengkapnya adalah \p{Letter}
atau bahkan p\{General_Category=Letter}
. Letter
itu sendiri adalah kelas komposit, tapi saya tidak akan pergi ke rincian, referensi terbaik yang bisa saya temukan pada subjek ada di sini .
Pustaka Python tidak terintegrasi ke dalam bahasa (ini adalah alternatif untuk re
pustaka bawaan). Jadi, Anda harus menginstalnya, misalnya:
# pip install regex
Kemudian, Anda bisa menggunakannya seperti ini:
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'>
>>>
Anda juga dapat meletakkan skrip ini di suatu tempat di mana Anda dapat mengaksesnya:
#!/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
Dan panggil saja dari Emacs seperti itu (misalkan Anda menyimpan skrip ini di ~/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)))
۱۲۳۴۵۶۷۸۹۰
tetapi ada beberapa yang benar-negatif, misalnya Arab atau Ibrani Alef:א
,ا
.