2011-01-20 35 views
19

Tôi có chuỗi. Hãy gọi nó là 'thử nghiệm'. Tôi muốn thử nghiệm một kết quả phù hợp cho chuỗi này, nhưng chỉ sử dụng backref của một regex.cách kiểm tra đối sánh regex

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

nhập tái

for line in f.readlines(): 
    if '<a href' in line: 
     if re.match('<a href="(.*)">', line) == 'test': 
     print 'matched!' 

? Điều này tất nhiên, dường như không hoạt động, nhưng tôi nghĩ rằng tôi có thể gần gũi? Về cơ bản câu hỏi là làm thế nào tôi có thể lấy lại để chỉ trả về backref để so sánh?

+0

Tôi khuyên bạn nên [Rubular] (http://rubular.com/) để phát triển regex - đó là một trình tiết kiệm thời gian rất lớn. Đây là một câu hỏi khác mà tôi đã giúp một người nào đó với một mô hình tương tự: http://stackoverflow.com/questions/4716787/problem-with-ruby-regular-expression –

Trả lời

18

re.match chỉ khớp ở số beginning của chuỗi.

def url_match(line, url): 
    match = re.match(r'<a href="(?P<url>[^"]*?)"', line) 
    return match and match.groupdict()['url'] == url: 

ví dụ sử dụng:

>>> url_match('<a href="test">', 'test') 
True 
>>> url_match('<a href="test">', 'te') 
False 
>>> url_match('this is a <a href="test">', 'test') 
False 

Nếu mô hình có thể xảy ra bất cứ nơi nào trong dòng, sử dụng re.search.

def url_search(line, url): 
    match = re.search(r'<a href="(?P<url>[^"]*?)"', line) 
    return match and match.groupdict()['url'] == url: 

ví dụ sử dụng:

>>> url_search('<a href="test">', 'test') 
True 
>>> url_search('<a href="test">', 'te') 
False 
>>> url_search('this is a <a href="test">', 'test') 
True 

N.B: Nếu bạn đang cố gắng phân tích cú pháp HTML sử dụng một regex, đọc RegEx match open tags except XHTML self-contained tags trước khi đi thêm nữa.

+4

+1 Phân tích cú pháp HTML bằng regex rất đáng được khuyên bảo. –

+0

Tuyệt vời. Cảm ơn vì đã trả lời. Làm cách nào để thay thế văn bản và ghi tệp? – jml

+1

Tôi nên đề cập rằng mặc dù tôi đọc bài đăng đó, nó cũng nói rằng bạn có thể sử dụng phương pháp này cho một trường hợp sử dụng hạn chế, đó là những gì tôi có. Tôi không muốn xây dựng một trình phân tích cú pháp bao hàm tất cả. – jml

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