Vấn đề
Bạn muốn tìm kiếm và thay thế một mẫu văn bản trong chuỗi.
Nếu mẫu rất đơn giản (chuỗi chữ nghĩa), phương thức str.replace() là giải pháp tối ưu.
Tìm kiếm văn bản
Ví dụ: Tạo chuỗi từ generator
def sample():
yield 'Is'
yield 'USA'
yield 'Colder'
yield 'Than'
yield 'Canada?'
text = ' '.join(sample())
print(f"Output \n {text}")
Kết quả: Is USA Colder Than Canada?
Tìm kiếm chính xác
# Tìm kiếm chính xác
print(f"Output \n {text == 'USA'}")
Kết quả: False
Sử dụng các phương thức chuỗi cơ bản
# Kiểm tra bắt đầu bằng
print(f"Output \n {text.startswith('Is')}")
# Kết quả: True
# Kiểm tra kết thúc bằng (lưu ý: ví dụ gốc có lỗi, dùng startswith lại)
print(f"Output \n {text.endswith('Canada?')}")
# Kết quả: True
# Tìm vị trí chuỗi con
print(f"Output \n {text.find('USA')}")
# Kết quả: 3
Sử dụng Regular Expression (re module) cho mẫu phức tạp
import re
# Tạo chuỗi ngày tháng
date1 = '22/10/2020'
# Kiểm tra mẫu: một hoặc nhiều chữ số (\d+)
if re.match(r'\d+/\d+/\d+', date1):
print('yes')
else:
print('no')
# Kết quả: yes
Thay thế văn bản
Thay thế đơn giản với str.replace()
print(f"Output \n {text.replace('USA', 'Australia')}")
Kết quả: Is Australia Colder Than Canada?
Thay thế phức tạp với re.sub()
Đối số đầu tiên là mẫu khớp, đối số thứ hai là mẫu thay thế. Ví dụ: chuyển định dạng ngày dd/mm/yyyy sang yyyy-dd-mm. Các số có gạch chéo ngược như \3 tham chiếu đến nhóm bắtCapture group trong mẫu.
import re
sentence = 'Date is 22/11/2020. Tommorow is 23/11/2020.'
# Thay thế
replaced_text = re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', sentence)
print(f"Output \n {replaced_text}")
Kết quả: Date is 2020-22-11. Tommorow is 2020-23-11.
Biên dịch mẫu trước để tăng hiệu năng
pattern = re.compile(r'(\d+)/(\d+)/(\d+)')
replaced_pattern = pattern.sub(r'\3-\1-\2', sentence)
print(f"Output \n {replaced_pattern}")
Kết quả: Date is 2020-22-11. Tommorow is 2020-23-11.
Đếm số lần thay thế với re.subn()
output, count = pattern.subn(r'\3-\1-\2', sentence)
print(f"Output \n {output}")
print(f"Output \n {count}")
Kết quả:
Date is 2020-22-11. Tommorow is 2020-23-11.
2