2013-04-25 36 views
7

Tôi có đối tượng đối sánh regex bằng Python. Tôi muốn nhận được văn bản phù hợp. Giả sử mẫu là '1.3' và chuỗi tìm kiếm là 'abc123xyz', tôi muốn nhận được '123'. Làm thế nào tôi có thể làm điều đó?Python: Nhận văn bản của một trận đấu Regex

Tôi biết tôi có thể sử dụng match.string[match.start():match.end()], nhưng tôi thấy rằng khá cồng kềnh (và trong một số trường hợp lãng phí) cho truy vấn cơ bản như vậy.

Có cách nào đơn giản hơn không?

+0

[ 're.finditer() '] (http://docs.python.org/2/library/re.html) – Elazar

+1

@Elazar đánh giá bằng câu hỏi, OP biết cách lấy' MatchObject', nhưng không biết cách dễ dàng lấy nội dung của chúng. –

Trả lời

7

Bạn chỉ có thể sử dụng chức năng đối tượng của trận đấu, group, như:

match = re.search(r"1.3", "abc123xyz") 
if match: 
    doSomethingWith(match.group(0)) 

để có được toàn bộ trận đấu. CHỈNH SỬA: làm chỉ số ra435, bạn cũng có thể bỏ qua số 0 và chỉ cần gọi match.group().

Lưu ý bổ sung: nếu mẫu của bạn có chứa dấu ngoặc đơn, bạn thậm chí có thể nhận được các đơn hàng nhỏ này, bằng cách đi qua 1, 2 và cứ thế là group().

+0

Không trực quan trong quan điểm của tôi ... Nhưng tôi đoán đó là điều tốt nhất mà Python cung cấp. –

+0

@RamRachum Tôi không nghĩ nó quá kỳ quặc. Khi bạn thực hiện thay thế regex bạn tham chiếu đến các nhóm chụp với '\ 1',' \ 2' và cứ thế (hoặc '$ 1',' $ 2', tùy thuộc vào việc triển khai), và toàn bộ kết hợp thường được gọi bằng cách sử dụng ' \ 0' (hoặc '$ 0'). Vì vậy, nó phù hợp với số lượng các nhóm. –

+1

Bạn có thể bỏ qua '0', chỉ' match.group() '. – georg

-1

Bạn cần phải đặt regex bên trong "()" để có thể nhận được phần đó

>>> var = 'abc123xyz' 
>>> exp = re.compile(".*(1.3).*") 
>>> exp.match(var) 
<_sre.SRE_Match object at 0x691738> 
>>> exp.match(var).groups() 
('123',) 
>>> exp.match(var).group(0) 
'abc123xyz' 
>>> exp.match(var).group(1) 
'123' 

hoặc nếu không nó sẽ không trở lại bất cứ điều gì:

>>> var = 'abc123xyz' 
>>> exp = re.compile("1.3") 
>>> print exp.match(var) 
None 
+1

Tôi không nghĩ rằng việc sử dụng '. * (...). *' Cho các kết quả chuỗi con là một thực hành tốt. Chỉ cần sử dụng 'tìm kiếm' thay vì' match' và nó làm tất cả cho bạn. Trong thực tế, nó thậm chí còn cao hơn, vì bạn sẽ không thể nhận được nhiều kết quả phù hợp với 'match' (thay vào đó nó sẽ trả về kết quả cuối cùng, cũng khá trực quan, trái ngược với cái đầu tiên). –

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