Vấn đề
Bạn muốn tìm kiếm và thay thế một mẫu văn bản trong một chuỗi.
Nếu chúng ta có các mẫu chữ rất đơn giản, sử dụng phương thức str.replace () là một giải pháp tối ưu.
Ví dụ
def sample(): yield 'Is' yield 'USA' yield 'Colder' yield 'Than' yield 'Canada?' text = ' '.join(sample()) print(f"Output \n {text}")
Đầu ra
Is USA Colder Than Canada?
Trước tiên, hãy để chúng tôi xem cách tìm kiếm văn bản.
# search for exact text print(f"Output \n {text == 'USA'}")
Đầu ra
False
Chúng ta có thể tìm kiếm văn bản bằng các phương thức chuỗi cơ bản, chẳng hạn như str.find (), str.endswith (), str.startswith ().
# text start with print(f"Output \n {text.startswith('Is')}")
Đầu ra
True
# text ends with print(f"Output \n {text.startswith('Is')}")
Đầu ra
True
# search text with find print(f"Output \n {text.find('USA')}")
Đầu ra
3
Nếu văn bản đầu vào để tìm kiếm phức tạp hơn thì chúng ta có thể sử dụng biểu thức chính quy và mô-đun re.
# Let us create a date in string format date1 = '22/10/2020'
# Let us check if the text has more than 1 digit. # \d+ - match one or more digits import re if re.match(r'\d+/\d+/\d+', date1): print('yes') else: print('no') yes
Bây giờ, quay lại với việc thay thế một văn bản. Nếu văn bản và chuỗi cần thay thế đơn giản thì hãy sử dụng str.replace ().
Đầu ra
print(f"Output \n {text.replace('USA', 'Australia')}")
Đầu ra
Is Australia Colder Than Canada?
Nếu có các mẫu phức tạp cần tìm kiếm và thay thế thì chúng ta có thể tận dụng các phương thức con () trong mô-đun re.
Đối số đầu tiên của sub () là mẫu cần khớp và đối số thứ hai là mẫu thay thế.
Trong ví dụ dưới đây, chúng tôi sẽ tìm các trường ngày tháng ở dạng dd / mm / yyyy và thay thế chúng bằng định dạng - yyyy-dd-mm.
import re sentence = 'Date is 22/11/2020. Tommorow is 23/11/2020.' # sentence replaced_text = re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', sentence) print(f"Output \n {replaced_text}")
Đầu ra
Date is 2020-22-11. Tommorow is 2020-23-11.
Một cách khác để làm là biên dịch biểu thức trước để có được hiệu suất tốt hơn.
Đầu ra
pattern = re.compile(r'(\d+)/(\d+)/(\d+)') replaced_pattern = pattern.sub(r'\3-\1-\2', sentence) print(f"Output \n {replaced_pattern}")
Đầu ra
Date is 2020-22-11. Tommorow is 2020-23-11.
re.subn () sẽ cung cấp cho chúng tôi số lần thay thế được thực hiện cùng với việc thay thế văn bản.
Đầu ra
output, count = pattern.subn(r'\3-\1-\2', sentence) print(f"Output \n {output}")
Đầu ra
Date is 2020-22-11. Tommorow is 2020-23-11.
Đầu ra
print(f"Output \n {count}")
Đầu ra
2