Làm cách nào để khớp một ký tự alpha với cụm từ thông dụng. Tôi muốn có một ký tự ở số \w
nhưng không có trong \d
. Tôi muốn nó tương thích unicode đó là lý do tại sao tôi không thể sử dụng [a-zA-Z]
.python-re: Làm cách nào để khớp một ký tự alpha
Trả lời
Hai câu đầu tiên của bạn mâu thuẫn với nhau. "in \w
nhưng không có trong \d
" bao gồm dấu gạch dưới. Tôi giả định từ câu thứ ba của bạn rằng bạn không muốn gạch dưới.
Sử dụng biểu đồ Venn ở mặt sau của phong bì sẽ giúp. Chúng ta hãy nhìn vào những gì chúng tôi KHÔNG muốn:
(1) ký tự không được kết hợp bởi \w
(tức là không muốn bất cứ điều gì đó không phải là alpha, chữ số, hoặc dấu gạch dưới) =>\W
(2) chữ số = >\d
(3) gạch =>_
Vì vậy, những gì chúng tôi không muốn bất cứ điều gì trong lớp nhân vật [\W\d_]
và hậu quả là những gì chúng ta làm muốn là bất cứ điều gì trong lớp nhân vật [^\W\d_]
Dưới đây là một ví dụ đơn giản (Python 2.6).
>>> import re
>>> rx = re.compile("[^\W\d_]+", re.UNICODE)
>>> rx.findall(u"abc_def,k9")
[u'abc', u'def', u'k']
thăm dò sâu hơn cho thấy một vài quirks của phương pháp này:
>>> import unicodedata as ucd
>>> allsorts =u"\u0473\u0660\u06c9\u24e8\u4e0a\u3020\u3021"
>>> for x in allsorts:
... print repr(x), ucd.category(x), ucd.name(x)
...
u'\u0473' Ll CYRILLIC SMALL LETTER FITA
u'\u0660' Nd ARABIC-INDIC DIGIT ZERO
u'\u06c9' Lo ARABIC LETTER KIRGHIZ YU
u'\u24e8' So CIRCLED LATIN SMALL LETTER Y
u'\u4e0a' Lo CJK UNIFIED IDEOGRAPH-4E0A
u'\u3020' So POSTAL MARK FACE
u'\u3021' Nl HANGZHOU NUMERAL ONE
>>> rx.findall(allsorts)
[u'\u0473', u'\u06c9', u'\u4e0a', u'\u3021']
U + 3021 (HANGZHOU số ONE) được coi là số (do đó nó phù hợp với \ w) nhưng có vẻ như Python diễn giải " chữ số" có nghĩa là "chữ số thập phân"(loại Nd) vì vậy nó không phù hợp với \ d
U + 2438 (vòng LATIN THƯ NHỎ Y) không khớp với \ w
chữ HánTất cả CJK được phân loại dưới dạng "chữ cái" và do đó khớp \ w
Cho dù bất kỳ điểm nào trong số 3 điểm trên đều là mối lo ngại hay không, cách tiếp cận đó là tốt nhất bạn sẽ thoát khỏi mô-đun đang được phát hành hiện tại. Cú pháp như \ p {letter} là trong tương lai.
Cảm ơn bạn! Mặc dù những điều kỳ quặc bạn đề cập đến tôi nghĩ rằng tôi có thể bắt đầu từ đây và xem những gì tôi có thể điều chỉnh. – basaundi
gì về:
\p{L}
Bạn có thể sử dụng tài liệu này như tài liệu tham khảo: Unicode Regular Expressions
EDIT: vẻ Python doesn't handle Unicode expressions. Hãy xem vào liên kết này: Handling Accented Characters with Python Regular Expressions -- [A-Z] just isn't good enough (không còn hoạt động, liên kết để lưu trữ internet)
tài liệu tham khảo khác:
- re.UNICODE
- python and regular expression with unicode
- Unicode Technical Standard #18: Unicode Regular Expressions
Đối hậu thế, đây là những ví dụ trên blog:
import re
string = 'riché'
print string
riché
richre = re.compile('([A-z]+)')
match = richre.match(string)
print match.groups()
('rich',)
richre = re.compile('(\w+)',re.LOCALE)
match = richre.match(string)
print match.groups()
('rich',)
richre = re.compile('([é\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)
richre = re.compile('([\xe9\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)
richre = re.compile('([\xe9-\xf8\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)
string = 'richéñ'
match = richre.match(string)
print match.groups()
('rich\xe9\xf1',)
richre = re.compile('([\u00E9-\u00F8\w]+)')
print match.groups()
('rich\xe9\xf1',)
matched = match.group(1)
print matched
richéñ
Cảm ơn bạn nhưng tôi không thể biết thời tiết một ký tự là biểu tượng dấu chấm câu (CJK) hoặc ký hiệu số không phải là 0-9 nếu tôi thực hiện một phạm vi như \ u00E9- \ u00F8. – basaundi
bạn có thể làm việc với các phạm vi chữ, nếu bạn tham khảo một tài liệu như http://www.tamasoft.co.jp/en/general-info/unicode.html và để chọn tất cả các khoảng chữ cái (có thể là nhàm chán ...); liên kết này cũng có thể giúp bạn: http://kourge.net/projects/regexp-unicode-block –
Một ví dụ về hành động này sẽ hữu ích ở đây. –
Bạn có thể sử dụng một trong các khái niệm sau để phù hợp với một chữ cái:
(?![\d_])\w
hoặc
\w(?<![\d_])
Ở đây tôi phù hợp cho \w
, nhưng kiểm tra rằng [\d_]
không được xuất hiện trước/sau đó .
Từ các tài liệu:
(?!...)
Matches if ... doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match 'Isaac ' only if it’s not followed by 'Asimov'.
(?<!...)
Matches if the current position in the string is not preceded by a match for .... This is called a negative lookbehind assertion. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length and shouldn’t contain group references. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched.
- 1. Làm cách nào để khớp các ký tự có dấu với một regex bằng Python?
- 2. Python: bắt đầu với bất kỳ ký tự alpha nào
- 3. làm cách nào để kiểm tra xem 3 ký tự có theo thứ tự alpha liên tiếp hay không
- 4. cách nhanh chóng để chia alpha và ký tự số trong một chuỗi python
- 5. Bạn làm cách nào để khớp các ký tự đại diện với XSLT?
- 6. Làm cách nào để khớp các ký tự unicode trong Java
- 7. Làm cách nào để đặt ký tự thoát (ký tự NOT "escape") trong một regex của Ruby?
- 8. NSPredicate khớp với bất kỳ ký tự nào
- 9. xóa ký tự alpha và khoảng trắng khỏi chuỗi
- 10. Làm thế nào để khớp các ký tự unicode với boost :: spirit?
- 11. Regex để khớp với URL cuối dòng hoặc ký tự "/"
- 12. PCRE regex có khớp với một ký tự null không?
- 13. Làm cách nào để tạo chuỗi để khớp với regex?
- 14. Làm cách nào để loại trừ một ký tự khỏi nhóm regex?
- 15. Cách chọn thứ gì đó khớp với ký tự đại diện/một phần với XPath
- 16. Làm cách nào để xác định độ dài của một ký tự chưa ký *?
- 17. Regex nào có thể khớp các chuỗi của cùng một ký tự?
- 18. Tôi làm cách nào để khớp các ký tự tiếng Hàn trong biểu thức chính quy Ruby?
- 19. Làm thế nào để xóa tất cả các ký tự sau một ký tự trong chuỗi?
- 20. Làm cách nào để tìm loại ký tự hai chiều của ký tự Unicode trong C#?
- 21. Làm cách nào để chèn ký tự sau mỗi n ký tự trong javascript?
- 22. Làm cách nào để đọc ký tự đầu vào theo ký tự trong Java?
- 23. Làm thế nào để vẽ bằng alpha?
- 24. Làm cách nào để tạo ngữ cảnh bitmap chỉ alpha
- 25. Làm cách nào để mã hóa các mã ký tự Unicode trong chuỗi ký tự PowerShell?
- 26. Làm cách nào để xóa các ký tự đặc biệt?
- 27. Làm cách nào để thoát khỏi ký tự @ trong Mac
- 28. Làm cách nào để chèn ký tự tab trong Iterm?
- 29. Vim: làm cách nào để trao đổi hai ký tự?
- 30. Làm cách nào để đặt ký tự động trong Android?
"unicode tương thích" - Điều đó có nghĩa rằng bạn muốn kết hợp cả e và é, ví dụ? – Seth
Trong Python, hãy nhớ rằng để chỉ ra một chuỗi unicode bạn phải sử dụng: chuỗi u'Unicode ở đây '- cho rằng bạn đã thử str.find() trong đó str là chuỗi unicode của bạn? – Alex
Điều tôi muốn nói là tôi muốn kết hợp một, é, あ, 日 나 nhưng không phải 1,. (ví dụ: chấm), 9, 9,。, v.v. . – basaundi