Tôi đang tìm cách nhanh nhất để thay thế một số lượng lớn các chuỗi con bên trong một chuỗi rất lớn. Dưới đây là hai ví dụ tôi đã sử dụng.Phương pháp Python nhanh nhất để tìm kiếm và thay thế trên một chuỗi lớn
findall() cảm thấy đơn giản và thanh lịch hơn, nhưng phải mất một khoảng thời gian đáng kinh ngạc.
công cụ tìm kiếm() thông qua một tệp lớn, nhưng tôi không chắc đây là cách phù hợp để thực hiện điều đó.
Dưới đây là một số mã mẫu. Lưu ý rằng văn bản thực tế mà tôi quan tâm là một chuỗi duy nhất có kích thước khoảng 10MB và có sự khác biệt lớn trong hai phương thức này.
import re
def findall_replace(text, reg, rep):
for match in reg.findall(text):
output = text.replace(match, rep)
return output
def finditer_replace(text, reg, rep):
cursor_pos = 0
output = ''
for match in reg.finditer(text):
output += "".join([text[cursor_pos:match.start(1)], rep])
cursor_pos = match.end(1)
output += "".join([text[cursor_pos:]])
return output
reg = re.compile(r'(dog)')
rep = 'cat'
text = 'dog cat dog cat dog cat'
finditer_replace(text, reg, rep)
findall_replace(text, reg, rep)
CẬP NHẬT Added phương pháp re.sub để kiểm tra:
def sub_replace(reg, rep, text):
output = re.sub(reg, rep, text)
return output
Kết quả
re.sub() - 0: 00: 00.031000
finditer() - 0 : 00: 00.109000
findall() - 0: 01: 17.260000
và điều thứ hai thực sự là nhanh hơn nhiều? Có vẻ lạ với tôi, họ nên dùng khoảng. cùng lúc. Và tôi nghĩ cả hai cách đều đúng. –
tại sao bạn không sử dụng phương thức phụ của re? –
Sử dụng + = với chuỗi là một hoạt động O (n^2), so với O (n) xây dựng danh sách và sử dụng "" để tham gia. –