2012-04-07 25 views
5

Tôi có mô hình này được viếtMẫu Regex không khớp với một số tiện ích nhất định?

^.*\.(?!jpg$|png$).+$ 

Tuy nhiên có một vấn đề - mô hình này phù hợp với file.name.jpg (2 chấm)

Nó hoạt động một cách chính xác (không phù hợp) trên filename.jpg. Tôi đang cố gắng tìm ra cách để làm cho nó không phù hợp với bất kỳ tập tin .jpg ngay cả khi tên của tập tin có 2 hoặc nhiều dấu chấm trong đó. Tôi đã thử sử dụng một cái nhìn phía sau nhưng python phàn nàn về việc không sử dụng một chiều rộng cố định (mà tôi không chính xác chắc chắn những gì có nghĩa là, nhưng tên tập tin sẽ có chiều dài thay đổi.)

Trả lời

10

này nên làm việc: ^.*\.(?!jpg$|png$)[^.]+$

+0

công việc tuyệt vời! tuyệt vời – yash

3

Sử dụng các chức năng tiện lợi của os.path lên filepath thành các thành phần cho phân tích dễ dàng hơn:

filepath, filename = os.path.split(str) 
basename, extension = os.path.splitext(filename) 

if exension[1:] in ['jpg', 'png']: 
    # The extension matches 

Hãy thử regex này (không làm điều đó nó hoàn toàn ngược lại những gì bạn muốn làm.):

\.(jpg|png)([^\.]|$) 
+0

Tôi không có quyền truy cập vào Python, đó là công cụ regex của Python, nhưng tôi chỉ có quyền truy cập vào tệp cấu hình JSON để đặt regex ở đó cho chương trình Python. Tôi đã xóa thẻ Python để tránh nhầm lẫn. –

+0

Xem chỉnh sửa của tôi. Tôi nghĩ rằng nó sẽ làm việc – Blender

+0

Regex của bạn trông giống như nó đang cố gắng loại trừ các chuỗi * chứa * '.jpg.' hoặc' .png.', nhưng tôi tin rằng ý tưởng là loại trừ mọi thứ * kết thúc * bằng '.jpg' hoặc '.png'. Regex của OP thất bại vì cả hai lookahead và '. + $' Cuối cùng có thể khớp với '.' đầu tiên trong' file.name.jpg'. Thay đổi giá trị đó thành '[^.] + $', Như @bereal đã thực hiện, buộc người tìm kiếm chỉ áp dụng cho chuỗi dấu chấm cuối cùng bất kỳ. –

0

Vui lòng thử

 
    .*\.(jpg$|png$) 

Nó sẽ phù hợp một cách chính xác trên filename.jpg. bạn đang cố gắng tìm ra cách làm cho phù hợp với bất kỳ tệp .jpg nào ngay cả khi tên tệp có 2 hoặc nhiều dấu chấm trong đó, sẽ hoạt động tốt.
Trong khi sử dụng tập lệnh python, hãy chắc chắn rằng bạn đang sử dụng đúng kiểu chia tách. loại khác nhau của split viz rsplit (chia rẽ phải) và lsplit (tách rời).

+0

Bạn đã hoàn tác: regex KHÔNG khớp với 'filename.jpg' OR' file.name.png'. 'filename.txt' hoặc' file.name.foo' không sao, tôi đoán vậy. –

1

Hình như bạn gần như đã có nó:

.*\.(?!jpg$|png$)[^.]+ 

Theo thử nghiệm của tôi (trong java) tôi nhận được những kết quả này:

file.jpg - false 
file.png - false 
file.name.jpg - false 
file.name.png - false 
file.gif - true 
file.name.gif - true 
file.jpg.gif - true 
file.jpge - true 

Nếu đây không phải là những gì bạn muốn lời cầu xin cập nhật câu hỏi của bạn với sự mong chờ của bạn.

1

Nếu bạn chỉ quan tâm rằng chuỗi không kết thúc với .jpg hoặc .png, bạn có thể sử dụng này:

^.+$(?<!\.jpg)(?<!\.png) 

Các ^.+ là không thực sự cần thiết, nhưng tùy thuộc vào cách phân tích cú pháp JSON được mã hóa bạn có thể cần phải ép buộc regex tiêu thụ toàn bộ chuỗi. Nếu bạn đang sử dụng regex cho xác thực khác là tốt, bạn có thể muốn một cái gì đó phức tạp hơn, như:

^\w+(?:\.\w+)+$(?<!\.jpg)(?<!\.png) 

Bạn có thể cố gắng sử dụng (?<!\.jpg|\.png), trong đó sẽ không làm việc vì hương vị regex Python là một trong những nhất hạn chế khi nói đến lookbehinds. PHP và Ruby 1.9+ sẽ chấp nhận nó vì mỗi lựa chọn thay thế có độ dài cố định. Họ thậm chí không phải là cùng chiều dài; (?<!\.jpg|\.jpeg|\.png) cũng sẽ hoạt động. Chỉ cần không cố gắng đưa ra dấu chấm, như trong (?<!\.(?:jpg|jpeg|png)); sự thay đổi phải ở mức cao nhất của lookbehind.

Java sẽ chấp nhận phiên bản thừa nhận bởi vì nó hoạt động nhiều hơn một chút vào thời gian biên dịch để xác định số ký tự tối đa mà đối tượng có thể cần phải khớp. Biểu thức lookbehind cần phải khá đơn giản, và nó không thể sử dụng các số phân định + hoặc *. Cuối cùng, các hương vị .NET và JGSoft không hề có bất kỳ hạn chế nào đối với các lookbehind. Nhưng Python thực hiện một nỗ lực rất đơn giản để tìm ra số ký tự chính xác mà lookbehind cần để khớp, tạo ra thông báo lỗi khó hiểu khi nó không thành công.

+0

Cảm ơn, câu trả lời tuyệt vời. –

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