2012-03-30 41 views
15

Tôi có một chuỗi và tôi muốn khớp thứ gì đó ở đầu bắt đầu với một mẫu tìm kiếm duy nhất. Điều này có thể giải quyết như thế nào?Làm cách nào để tôi có thể bắt đầu và kết thúc trong regex của Python?

giả sử chúng ta có một chuỗi như:

string = "ftp://www.somewhere.com/over/the/rainbow/image.jpg" 

tôi muốn làm một cái gì đó như thế này:

re.search("^ftp:// & .jpg$" ,string) 

Rõ ràng, đó là không chính xác, nhưng tôi hy vọng nó được quan điểm của tôi qua. Điều này có thể không?

+1

Bạn có nghĩ rằng để kiểm tra các tài liệu? – Marcin

Trả lời

13

re.match sẽ match the string at the beginning, trái ngược với re.search:

re.match(r'(ftp|http)://.*\.(jpg|png)$', s) 

Hai điều cần lưu ý ở đây:

  • r'' được sử dụng cho chuỗi chữ để làm cho nó tầm thường để có dấu gạch chéo ngược bên trong regex
  • string là một mô-đun tiêu chuẩn, vì vậy tôi đã chọn s như là một biến
  • Nếu bạn sử dụng một regex nhiều hơn một lần, bạn có thể sử dụng r = re.compile(...) để xây dựng bộ máy nhà nước một lần và sau đó sử dụng r.match(s) sau đó để phù hợp với chuỗi

Nếu bạn muốn, bạn cũng có thể sử dụng các mô-đun urlparse để phân tích các URL cho bạn (mặc dù bạn vẫn cần phải trích xuất các phần mở rộng):

>>> allowed_schemes = ('http', 'ftp') 
>>> allowed_exts = ('png', 'jpg') 
>>> from urlparse import urlparse 
>>> url = urlparse("ftp://www.somewhere.com/over/the/rainbow/image.jpg") 
>>> url.scheme in allowed_schemes 
True 
>>> url.path.rsplit('.', 1)[1] in allowed_exts 
True 
15

Làm thế nào để không sử dụng cụm từ thông dụng?

if string.startswith("ftp://") and string.endswith(".jpg"): 

Bạn có nghĩ điều này đẹp hơn không?

Bạn cũng có thể hỗ trợ nhiều tùy chọn cho việc bắt đầu và kết thúc:

if (string.startswith(("ftp://", "http://")) and 
    string.endswith((".jpg", ".png"))): 
+0

Tôi sẽ, nhưng nó phức tạp hơn vì có một số chuỗi bắt đầu và kết thúc hợp lệ. Nếu tôi biết cách thực hiện trường hợp đơn giản này, tôi có thể làm cho nó hoạt động với thực tế phức tạp hơn. :) –

+1

@Google: Bạn cũng có thể truy vấn nhiều chuỗi, xem cập nhật của tôi. –

3

Hãy thử

re.search(r'^ftp://.*\.jpg$' ,string) 

nếu bạn muốn tìm kiếm biểu thức chính quy. Lưu ý rằng bạn phải thoát khỏi khoảng thời gian bởi vì nó có một ý nghĩa đặc biệt trong các biểu thức chính quy.

9

Đừng tham lam, sử dụng ^ftp://(.*?)\.jpg$

2
import re 

s = "ftp://www.somewhere.com/over/the/rainbow/image.jpg" 
print(re.search("^ftp://.*\.jpg$", s).group(0)) 
Các vấn đề liên quan