2012-01-19 21 views
21

Tôi có một chuỗi từ mà tôi muốn trích xuất 3 nhóm:Matching chỉ thư unicode trong Python lại

'19 janvier 2012' -> '19', 'janvier', '2012' 

Tên tháng có thể chứa các ký tự ASCII không, vì vậy [A-Za-z] không làm việc cho tôi:

>>> import re 
>>> re.search(ur'(\d{,2}) ([A-Za-z]+) (\d{4})', u'20 janvier 2012', re.UNICODE).groups() 
(u'20', u'janvier', u'2012') 
>>> re.search(ur'(\d{,2}) ([A-Za-z]+) (\d{4})', u'20 février 2012', re.UNICODE).groups() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'groups' 
>>> 

tôi có thể sử dụng \w nhưng nó phù hợp với chữ số và nhấn mạnh:

>>> re.search(ur'(\w+)', u'février', re.UNICODE).groups() 
(u'f\xe9vrier',) 
>>> re.search(ur'(\w+)', u'fé_q23vrier', re.UNICODE).groups() 
(u'f\xe9_q23vrier',) 
>>> 

Tôi cố gắng để sử dụng [:alpha:], nhưng nó không làm việc:

>>> re.search(ur'[:alpha:]+', u'février', re.UNICODE).groups() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'groups' 
>>> 

Nếu tôi bằng cách nào đó có thể phù hợp với \w mà không [_0-9], nhưng tôi không biết làm thế nào. Và ngay cả khi tôi tìm ra cách để làm điều này, có một lối tắt sẵn sàng như [:alpha:] hoạt động trong Python không?

+1

Đối với '[: alpha:]', điều này chỉ hoạt động bên trong một lớp ký tự, do đó, regex chính xác sẽ là '[[: alpha:]] +', nhưng Python không hỗ trợ chúng. –

+0

Tại sao không chỉ đơn giản gọi .split() trên chuỗi? – yak

Trả lời

42

Bạn có thể xây dựng một lớp nhân vật mới:

[^\W\d_] 

thay vì \w. Dịch sang tiếng Anh, có nghĩa là "Bất kỳ ký tự nào không phải là ký tự không phải chữ và số ([^\W] đều giống như \w), nhưng đó cũng không phải là chữ số và không phải là dấu gạch dưới".

Do đó, nó sẽ chỉ cho phép các chữ cái Unicode (nếu bạn sử dụng tùy chọn biên dịch re.UNICODE).

+0

Tôi đã nhận ra rằng '\ p {L}' không được hỗ trợ, vì vậy giải pháp của bạn là cách để đi +1. – stema

+1

Giải pháp rất tốt !!! Có một câu hỏi. Nếu tôi muốn cho phép dấu trừ (-). –

+0

để bao gồm '' -'' trong bất kỳ lớp ký tự regex nào, chỉ cần đặt nó ở cuối (hoặc bắt đầu): '' [^ \ W \ d _-] '' cho ví dụ này. – RichVel