2008-10-08 28 views
16

Cụm từ thông dụng cho phù hợp với chuỗi (trong trường hợp này là tên tệp) bắt đầu bằng 'Chạy' và có đuôi tệp '.py'?Cụm từ thông dụng để phù hợp với phần đầu của tên tập tin và phần mở rộng tên tập tin

Các biểu thức chính quy phải phù hợp với bất kỳ những điều sau đây:

RunFoo.py 
RunBar.py 
Run42.py 

Nó không phải phù hợp:

myRunFoo.py 
RunBar.py1 
Run42.txt 

SQL tương đương với những gì tôi đang tìm kiếm là ... LIKE 'Run%.py' ....

Trả lời

32

Đối với một biểu thức chính quy, bạn sẽ sử dụng:

re.match(r'Run.*\.py$') 

Một giải thích nhanh:

  • . có nghĩa là phù hợp với bất kỳ nhân vật nào.
  • * có nghĩa là phù hợp với bất kỳ lặp lại của nhân vật trước đó (do đó. * Có nghĩa là bất kỳ chuỗi ký tự)
  • \ là một lối thoát để thoát khỏi dấu chấm rõ ràng
  • $ chỉ "kết thúc của chuỗi", vì vậy chúng tôi don' t khớp với "Run_foo.py.txt"

Tuy nhiên, đối với tác vụ này, bạn có thể nên sử dụng các phương pháp chuỗi đơn giản hơn. I E.

filename.startswith("Run") and filename.endswith(".py") 

Lưu ý: nếu bạn muốn trường hợp vô hồn (tức là phù hợp với "run.PY" cũng như "Run.py", sử dụng tùy chọn re.I để biểu thức chính quy, hoặc chuyển sang một trường hợp cụ thể (. ví dụ filename.lower()) trước khi sử dụng phương pháp chuỗi

+2

1. bạn không phải chỉ định bắt đầu dòng cho khớp biểu thức chính quy python? 2. * không phù hợp hoặc nhiều hơn (ví dụ như vậy Run.py sẽ được chấp nhận) –

+0

Ngoài ra, bạn sẽ làm cho nó không phân biệt chữ hoa chữ thường như thế nào? –

+0

re.match đã chỉ định sự bắt đầu của chuỗi (trái với re.search, mà không). "Run.py" * nên * khớp, với định nghĩa (Nó bắt đầu bằng Run và có phần mở rộng .py). Đối với trường hợp không nhạy cảm, hãy xem ghi chú ở cuối. – Brian

0

này có lẽ không hoàn toàn tuân thủ các tiêu chuẩn đặt tên tệp tin, nhưng ở đây nó đi:

/^Run[\w]*?\.py$/ 
+0

trông giống như một giải pháp Perl cho một câu hỏi được gắn thẻ trăn ... nhưng tôi không phải là một chuyên gia về python: p và như jobscry chỉ ra giải pháp của bạn là trường hợp nhạy cảm. –

+0

* err có Rob Howard chỉ ra rằng là –

+0

Bạn không nên sử dụng. *, Thay vì \ w - dấu chấm câu và khoảng trắng vv có lẽ vẫn nên được coi là một phần của tên tệp. ví dụ: "Run.foo.py" – Brian

6
/^Run.*\.py$/ 

Hoặc, trong python cụ thể:

import re 
re.match(r"^Run.*\.py$", stringtocheck) 

này sẽ phù hợp "Runfoobar .py ", nhưng không phải" runfoobar.PY ". Để làm cho nó là trường hợp nhạy cảm, thay vì sử dụng:

re.match(r"^Run.*\.py$", stringtocheck, re.I) 
0

mabye:

^Run.*\.py$ 

chỉ một cách nhanh chóng thử

+0

Bạn cần. *, thay vì.? (mà sẽ chỉ phù hợp với một ký tự đơn) – Brian

+0

doh, cảm ơn Brian – imjoevasquez

14

Cảnh báo:.

  • câu trả lời jobscry của ("?.^Run py $") là không chính xác (sẽ không phù hợp "Run123.py", cho ví dụ)
  • câu trả lời của orlandu63 ("/^Run[\w]*?.py$/") sẽ không khớp với "RunFoo.Bar.py".

(Tôi không có đủ danh tiếng để nhận xét, xin lỗi.)

+0

Chúng tôi sẽ lấy cho bạn những điểm đại diện đó :) –

+1

Cripes, nhanh chóng. Cảm ơn. :-) –

2

Nếu bạn viết một biểu thức chính quy hơi phức tạp hơn, bạn có thể nhận được một tính năng bổ sung: trích xuất các bit giữa "Run" và "py":

>>> import re 
>>> regex = '^Run(?P<name>.*)\.py$' 
>>> m = re.match(regex, 'RunFoo.py') 
>>> m.group('name') 
'Foo' 

(bit thêm là dấu ngoặc đơn và mọi thứ giữa chúng, ngoại trừ '. *' giống như câu trả lời của Rob Howard)

12

Tôi thực sự không hiểu tại sao bạn lại có một biểu thức chính quy để giải quyết 'vấn đề' này. Bạn chỉ sau một cách để tìm tất cả các tệp .py bắt đầu bằng 'Chạy'. Vì vậy, đây là một giải pháp đơn giản mà sẽ làm việc, mà không cần đến biên soạn một chạy một biểu thức chính quy:

import os 
for filename in os.listdir(dirname): 
    root, ext = os.path.splitext(filename) 
    if root.startswith('Run') and ext == '.py': 
     print filename 
4

Bạn không cần một biểu hiện thường xuyên, bạn có thể sử dụng glob, trong đó có các kí hiệu ví dụ Chạy * .py

Ví dụ, để có được các tập tin trong thư mục hiện tại của bạn ...

import os, glob 
files = glob.glob("".join([ os.getcwd(), "\\Run*.py"])) 
Các vấn đề liên quan