2011-07-10 41 views
10

tôi biết rằng [] biểu thị một tập hợp các ký tự cho phép -chênh lệch b/w [ab] và (a | b) trong đối sánh regex?

>>> p = r'^[ab]$' 
>>> 
>>> re.search(p, '') 
>>> re.search(p, 'a') 
<_sre.SRE_Match object at 0x1004823d8> 
>>> re.search(p, 'b') 
<_sre.SRE_Match object at 0x100482370> 
>>> re.search(p, 'ab') 
>>> re.search(p, 'ba') 

Nhưng ... hôm nay tôi tình cờ gặp một biểu hiện bằng các thanh dọc trong ngoặc để xác định mô hình loại trừ lẫn nhau -

>>> q = r'^(a|b)$' 
>>> 
>>> re.search(q, '') 
>>> re.search(q, 'a') 
<_sre.SRE_Match object at 0x100498dc8> 
>>> re.search(q, 'b') 
<_sre.SRE_Match object at 0x100498e40> 
>>> re.search(q, 'ab') 
>>> re.search(q, 'ba') 

Điều này có vẻ để bắt chước các chức năng tương tự như trên, hoặc tôi thiếu một cái gì đó?

PS: Trong số Python, dấu ngoặc đơn được sử dụng để xác định nhóm hợp lý của văn bản phù hợp. Nếu tôi sử dụng kỹ thuật thứ hai, thì làm cách nào để sử dụng dấu ngoặc đơn cho cả hai công việc?

+0

Không chắc về những gì bạn có ý nghĩa với các bit ngoặc ... –

+1

Vâng, bạn là chính xác - '[ab]' và '(một | b) 'cả hai kết hợp _exactly_ cùng một điều (nhưng cái đầu tiên sẽ khớp nhanh hơn). Các biểu thức chính quy là một ngôn ngữ cho chính chúng (cho dù bạn tìm thấy chúng bằng Python hay Perl) và bạn cần phải tìm hiểu cú pháp (khó hiểu) của chúng nếu bạn định sử dụng chúng một cách hiệu quả. (ví dụ: Dấu ngoặc đơn bên trong một regex không giống như dấu ngoặc đơn bên ngoài regex.) Tôi khuyên bạn nên làm theo hướng dẫn tại [regular-expressions.info] (http://www.regular-expressions.info). Bất kỳ thời gian nào ở đó sẽ được thưởng nhiều lần. – ridgerunner

Trả lời

16

Trong trường hợp này, nó giống nhau.

Tuy nhiên, thay đổi không chỉ giới hạn ở một ký tự đơn lẻ. Ví dụ,

^(hello|world)$ 

sẽ phù hợp "hello" hay "thế giới" (và chỉ hai đầu vào này) trong khi

^[helloworld]$ 

sẽ chỉ phù hợp với một nhân vật duy nhất ("h" hoặc "w" hoặc "d" hoặc whatnot).

Mã hóa vui vẻ.

13

[ab] khớp với một ký tự (a hoặc b) và không chụp nhóm. (a|b) chụp a hoặc b và đối sánh nó. Trong trường hợp này, không có sự khác biệt lớn, nhưng trong các trường hợp phức tạp hơn, [] chỉ có thể chứa các ký tự và các lớp ký tự, trong khi (|) có thể chứa regex phức tạp tùy ý ở hai bên của đường ống

3

Trong ví dụ bạn đã cho chúng hoán đổi cho nhau. Có một số khác biệt đáng chú ý:

Trong lớp nhân vật dấu ngoặc vuông bạn không cần phải thoát ra bất cứ điều gì nhưng một dấu gạch ngang hay dấu ngoặc vuông, hoặc caret^

(nhưng sau đó chỉ khi nó là ký tự đầu tiên.)

Dấu ngoặc đơn phù hợp để bạn có thể tham khảo sau này. Các trận đấu lớp nhân vật không làm điều đó.

Bạn có thể kết hợp các chuỗi đa ký tự trong ngoặc đơn nhưng không phải trong các lớp nhân vật

Các vấn đề liên quan