2011-09-20 31 views
6

Tôi đang cố gắng tìm chức năng trong python tương tự như chức năng quét của Ruby. Mục tiêu của tôi là lấy tất cả văn bản ở giữa hai dấu ngoặc nhọn trong một danh sách. Nếu có nhiều cặp dấu ngoặc nhọn trong chuỗi, tôi muốn có nhiều mục nhập trong danh sách.Python Regex chỉ chụp một số văn bản nhất định

Khi tôi chạy mã này:

match = re.search(r'\{(.+)\}', request.params['upsell']) 
print match.group() 

tôi phù hợp với văn bản đúng. Tuy nhiên, những gì được chụp bao gồm các dấu ngoặc nhọn. Tôi không muốn bao gồm các văn bản này, tôi muốn bao gồm tất cả mọi thứ ở giữa, nhưng không phải là niềng răng xoăn Cảm ơn!

Trả lời

9
re.findall(r'\{(.+?)\}', request.params['upsell']) 

Điều này sẽ trả về danh sách trong đó mỗi mục nhập là nội dung của một nhóm dấu ngoặc nhọn khác. Lưu ý rằng thao tác này sẽ không hoạt động đối với các dấu ngoặc lồng nhau.

? sau .+ sẽ biến nó thành một trận đấu lười (thay vì tham lam). Điều này có nghĩa là trận đấu sẽ dừng tại "}" đầu tiên, thay vì tiếp tục đối sánh với nhiều ký tự nhất có thể và kết thúc vào cú đúp đóng cuối cùng.

re.findall() sẽ tìm kiếm trong chuỗi của bạn và tìm tất cả các kết quả trùng lặp không trùng lặp và trả về nhóm. Hoặc bạn có thể sử dụng re.finditer() sẽ lặp lại đối tượng Đối sánh, nhưng sau đó bạn sẽ cần sử dụng match.group(1) để chỉ lấy nội dung bên trong dấu ngoặc. Đây cũng là những gì bạn sẽ cần phải thay đổi trong ví dụ của bạn, match.group() trả lại toàn bộ kết quả không phải nhóm được chụp, vì bạn cần phải đặt số cho nhóm mà bạn muốn.

1
>>> import re 
>>> re.findall(r'{([^{}]*)}', '{a} { {b} c { {d} } }') 
['a', 'b', 'd'] 
9

Sử dụng group(1) hoặc lookbehinds/aheads. (Ngoài ra, hãy chắc chắn để có những lời khuyên của F.J. và J.F. và sử dụng một trong hai .+? hoặc [^{}]*

import re 
match = re.search(r'\{(.+)\}', "asdfasd {asdf}asdfasdf") 
print match.group(1) 

hoặc với lookbehinds/aheads:

import re 
match = re.search(r'(?<=\{)(.+)(?=\})', "asdfasd {asdf}asdfasdf") 
print match.group() 
Các vấn đề liên quan