2009-11-23 38 views
8

Tôi đang cố gắng tìm ra cụm từ thông dụng khớp với bất kỳ chuỗi nào không bắt đầu bằng mpeg. Việc khái quát hóa điều này phù hợp với bất kỳ chuỗi nào không bắt đầu bằng một cụm từ thông dụng nhất định.Cụm từ thông dụng khớp với mọi thứ ngoại trừ một cụm từ thông dụng nhất định

tôi đã cố gắng một cái gì đó giống như sau:

[^m][^p][^e][^g].* 

Vấn đề ở đây là nó đòi hỏi ít nhất 4 ký tự có mặt trong chuỗi. Tôi đã không thể tìm ra một cách tốt để xử lý điều này và một cách tổng quát để xử lý điều này một cách có mục đích chung.

Tôi sẽ sử dụng tính năng này bằng Python.

+2

Nếu bạn có một regex phù hợp với tất cả mọi thứ mà bạn không muốn, và không phù hợp với tất cả mọi thứ bạn muốn , tại sao không chỉ sử dụng 'không'? –

+3

Tại sao wiki cộng đồng này lại là? –

+0

Ồ, tôi không nghĩ mình hiểu mục đích của cộng đồng wiki. Vì vậy, tôi đã chọn hộp kiểm do nhầm lẫn. –

Trả lời

22
^(?!mpeg).* 

này sử dụng một lookahead tiêu cực đến chỉ phù hợp với một chuỗi nơi đầu doesn' t khớp với mpeg. Về cơ bản, nó yêu cầu "vị trí ở đầu chuỗi không thể là vị trí mà chúng tôi bắt đầu khớp với regex mpeg, chúng tôi có thể khớp thành công" - do đó khớp với bất kỳ thứ gì không bắt đầu bằng mpeg và không khớp với bất kỳ thứ gì .

Tuy nhiên, tôi muốn được tò mò về bối cảnh mà bạn đang sử dụng này - có thể có lựa chọn khác ngoài việc regex đó sẽ là một trong hai hiệu quả hơn hoặc dễ đọc hơn, chẳng hạn như ...

if not inputstring.startswith("mpeg"): 
+0

+1 cho cả hai trả lời câu hỏi, và cung cấp một (có lẽ) thay thế tốt hơn. –

+0

Regex đang được người dùng nhập thông qua giao diện web. Vì vậy, tôi không viết regex bản thân mình trong chương trình python. Regex là loại thiết lập bộ lọc cho thư mục xem mà từ đó phần mềm của tôi chọn tệp. người dùng sử dụng giao diện người dùng để điền vào regex. Mã python của tôi lấy regex này làm tiêu chí lọc và chọn các tệp thích hợp từ thư mục xem. Thanx rất nhiều về câu trả lời. –

+0

Hoặc thậm chí 'nếu không inputstring.startswith ('mpeg')' – Paul

2

Thử look-ahead assertion:

(?!mpeg)^.* 

Hoặc nếu bạn muốn sử dụng lớp phủ nhận chỉ:

^(.{0,3}$|[^m]|m([^p]|p([^e]|e([^g])))).*$ 
+0

regex "lớp phủ định" của bạn sẽ không hoạt động. kiểm tra cú pháp của bạn. –

+0

@ J-16 SDiZ: Tại sao bạn nghĩ vậy? – Gumbo

+0

Có lẽ vì anh ấy nghĩ rằng bạn đang cố gắng "không phù hợp" mpeg trước khi bắt đầu chuỗi. Mặc dù nó hoàn toàn hợp pháp kể từ^là một neo không có chiều rộng bằng không - anh ta mặc dù vô cùng vì nó trông khó hiểu. –

8

không làm bạn mất tập trung với regex.

if len(mystring) >=4 and mystring[:4]=="mpeg": 
    print "do something" 

hoặc sử dụng startswith() với "không phải là" từ khóa

if len(mystring)>=4 and not mystring.startswith("mpeg") 
+5

Lưu ý rằng bạn không thực sự cần kiểm tra 'len()' - bạn có thể cắt chuỗi vượt quá ranh giới của chúng, bạn sẽ chỉ nhận được ít ký tự hơn. – Amber

+0

vâng, tôi biết điều đó. chỉ có thể tôi hiểu sai yêu cầu của OP. Anh ta nói "nó đòi hỏi ít nhất 4 ký tự để có mặt trong chuỗi". Từ khóa là "trong chuỗi". Nó có thể là một chuỗi dài và anh ta cũng có thể có yêu cầu đó. Dù sao, nó lên đến OP bây giờ để làm cho nó được thực hiện đúng. – ghostdog74

+0

Tôi nghĩ rằng bit đã nói rằng nỗ lực ban đầu của mình tại một regex yêu cầu 4 ký tự trong chuỗi, khi ông thực sự muốn phù hợp với bất cứ điều gì không bắt đầu với "mpeg", ngay cả khi nó ít hơn 4 ký tự. – Amber

0

regexp của bạn sẽ không phù hợp với "npeg", tôi nghĩ rằng bạn sẽ cần phải đưa ra ^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g])))), mà là khá khủng khiếp. Một giải pháp thay thế khác là ^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g]) chỉ tốt hơn một chút.

Vì vậy, tôi nghĩ rằng bạn thực sự cần sử dụng một sự khẳng định nhìn về phía trước theo đề nghị của Dav và Gumbo :-)

+0

Phương án thay thế của bạn không phải là giải pháp thay thế vì nó không chính xác. Nó sẽ không khớp với * npeg *. – Gumbo

+0

Bạn đã thử? re.match (r "^ (. {0,3} $ | [^ m] |. [^ p] | .. [^ e] | ... [^ g])", "npeg") trả về một Đối tượng phù hợp. Nó hoạt động vì [^ m] vượt qua. –

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