2011-06-09 22 views
5

Tôi muốn tìm kiếm đối sánh regex trong một chuỗi lớn hơn từ một vị trí nhất định trở vềmà không sử dụng lát cắt.Áp dụng Regex cho chuỗi con Nếu không sử dụng String Slice

Nền của tôi là tôi muốn tìm kiếm thông qua một chuỗi lặp đi lặp lại cho các kết quả phù hợp với nhiều regex khác nhau. Một giải pháp tự nhiên trong Python sẽ theo dõi vị trí hiện tại trong chuỗi và sử dụng ví dụ:

re.match(regex, largeString[pos:]) 

trong vòng lặp. Nhưng đối với chuỗi dây (~ 1MB) thực sự lớn như trong largeString[pos:] trở nên đắt đỏ. Tôi đang tìm cách để vượt qua điều đó.

Lưu ý phụ: Funnily, trong một niche của Python documentation, nó nói về tham số pos tùy chọn cho hàm kết hợp (chính xác là điều tôi muốn), không được tìm thấy với chính hàm :-) .

Trả lời

6

Các biến thể có tham số pos và endpos chỉ tồn tại dưới dạng thành viên của đối tượng cụm từ thông dụng. Hãy thử điều này:

import re 
pattern = re.compile("match here") 
input = "don't match here, but do match here" 
start = input.find(",") 
print pattern.search(input, start).span() 

... đầu ra (25, 35)

+0

Đây là điên! Tham số '' pos'' thực sự ở đó, nhưng chỉ với các phương thức đối tượng! Tôi chắc đã bị mù ... Cảm ơn rất nhiều, cũng với những người khác. – ThomasH

4

Từ khóa pos chỉ có sẵn trong các phiên bản phương pháp. Ví dụ,

re.match("e+", "eee3", pos=1) 

là không hợp lệ, nhưng

pattern = re.compile("e+") 
pattern.match("eee3", pos=1) 

công trình.

+0

... và tôi đã chắc chắn rằng sự khác biệt duy nhất giữa chức năng mô-đun và phương pháp đối tượng là tham số regex (và có thể là cờ): - /. Đổ lỗi cho tôi. – ThomasH

1

Bạn cũng có thể sử dụng lookbehinds tích cực, như vậy:

import re 

test_string = "abcabdabe" 

position=3 
a = re.search("(?<=.{" + str(position) + "})ab[a-z]",test_string) 

print a.group(0) 

sản lượng:

abd 
+0

Cảm ơn ý tưởng, nhưng đối với các chuỗi đầu vào dài, nếu tôi đang tìm kiếm ở cuối chuỗi đó, điều này sẽ tạo ra một cái nhìn dài verrryyyy sau :). Nhưng tôi sẽ giữ nó sau. – ThomasH

2
>>> import re 
>>> m=re.compile ("(o+)") 
>>> m.match("oooo").span() 
(0, 4) 
>>> m.match("oooo",2).span() 
(2, 4) 
Các vấn đề liên quan