Trong trường hợp bạn rất quan tâm đến các ký tự quốc gia và xử lý chính xác các lớp ký tự Unicode, thì giải pháp duy nhất tôi có thể tìm thấy cho đến nay là regex
thư viện Python . Cả grep
và Perl
(với sự ngạc nhiên hoàn toàn của tôi!) Đã không thực hiện công việc đúng cách.
Vì vậy, biểu thức chính quy bạn theo sau là cái này : \p{L}
. Đây được gọi là phiên bản tốc ký thuộc tính Unicode, phiên bản đầy đủ \p{Letter}
hoặc thậm chí p\{General_Category=Letter}
. Letter
bản thân nó là một lớp tổng hợp, nhưng tôi sẽ không đi vào chi tiết, tài liệu tham khảo tốt nhất tôi có thể tìm thấy về chủ đề này ở đây .
Thư viện Python không được tích hợp vào ngôn ngữ (nó là một thay thế cho re
thư viện tích hợp). Vì vậy, bạn sẽ cần phải cài đặt nó, ví dụ:
# pip install regex
Sau đó, bạn có thể sử dụng nó như vậy:
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'>
>>>
Bạn cũng có thể đặt đoạn script này ở nơi bạn có thể truy cập nó:
#!/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
Và gọi nó từ Emacs như vậy (giả sử bạn đã lưu tập lệnh này vào ~/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)))
۱۲۳۴۵۶۷۸۹۰
nhưng có một số tiêu cực thực sự, ví dụ tiếng Ả Rập hoặc tiếng Do Thái Alef:א
,ا
.