Ký tự thoát đặc biệt trong biểu thức chính quy Python
Giả sử chúng ta cần làm cho một ký tự đặc biệt biểu thị chính nó. Để làm điều này, cần phải thoát nó bằng dấu gạch chéo ngược. Hãy xem xét các ví dụ.
Ví dụ
Trong ví dụ sau, tác giả của biểu thức chính quy muốn mẫu tìm kiếm trông như thế này: chữ cái
'a', sau đó dấu cộng '+', sau đó
chữ cái 'x'. Tuy nhiên, tác giả mã
không thoát ký tự '+' và do đó
mẫu tìm kiếm thực tế trông như thế này:
chữ cái 'a' một hoặc nhiều lần,
sau đó chữ cái 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Kết quả thực thi mã:
'a+x ! ! !'
Ví dụ
Và bây giờ tác giả đã thoát dấu cộng bằng dấu gạch chéo ngược. Bây giờ mẫu tìm kiếm trông như
chúng ta muốn: chữ cái 'a', sau đó dấu cộng
'+', sau đó chữ cái 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Kết quả thực thi mã:
'! ax aax aaax'
Ví dụ
Trong ví dụ này, mẫu trông như thế này:
chữ cái 'a', sau đó dấu chấm '.',
sau đó chữ cái 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Kết quả thực thi mã:
'! abx azx'
Ví dụ
Trong ví dụ tiếp theo, tác giả quên thoát dấu chấm và tất cả các chuỗi con đều khớp với biểu thức chính quy, vì dấu chấm không được thoát biểu thị bất kỳ ký tự nào:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Kết quả thực thi mã:
'! ! !'
Nhận xét
Lưu ý rằng nếu bạn quên dấu gạch chéo ngược cho dấu chấm (khi nó phải biểu thị chính nó) - điều này có thể thậm chí không được chú ý:
res = re.sub('a.x', '!', 'a.x')
print(res) # trả về '!', như chúng ta muốn
Trực quan thì hoạt động đúng (vì dấu chấm
biểu thị bất kỳ ký tự nào, bao gồm cả
dấu chấm thông thường '.'). Nhưng nếu thay đổi
chuỗi mà các thay thế diễn ra - chúng ta
sẽ thấy lỗi của mình:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # trả về '! ! !', trong khi mong đợi '! abx azx'
Danh sách ký tự đặc biệt và ký tự thông thường
Nếu thoát một ký tự thông thường - không có gì tồi tệ xảy ra - nó vẫn sẽ biểu thị chính nó. Ngoại lệ - chữ số, không thể thoát chúng.
Thường nảy sinh nghi ngờ, liệu một ký tự cụ thể có phải là đặc biệt hay không. Một số người đi đến mức thoát tất cả các ký tự đáng ngờ một cách liên tục. Tuy nhiên, đây là thực hành không tốt (làm lộn xộn biểu thức chính quy với các dấu gạch chéo ngược).
Là ký tự đặc biệt: $ ^ . * + ? \ / {} [] () |
Không phải là ký tự đặc biệt: @ : , ' " - _ = < > % # ~ `& !
Bài tập thực hành
Cho chuỗi:
txt = 'a.a aba aea'
Viết biểu thức chính quy tìm chuỗi
'a.a', không lấy các chuỗi khác.
Cho chuỗi:
txt = '2+3 223 2223'
Viết biểu thức chính quy tìm chuỗi
'2+3', không lấy các chuỗi khác.
Cho chuỗi:
txt = '23 2+3 2++3 2+++3 345 567'
Viết biểu thức chính quy tìm các chuỗi
'2+3', '2++3', '2+++3',
không lấy các chuỗi khác (+ có thể là bất kỳ
số lượng nào).
Cho chuỗi:
txt = '23 2+3 2++3 2+++3 445 677'
Viết biểu thức chính quy tìm các chuỗi
'23', '2+3', '2++3',
'2+++3', không lấy các chuỗi khác.
Cho chuỗi:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Viết biểu thức chính quy tìm các chuỗi
'*q+', '*qq+', '*qqq+',
không lấy các chuỗi khác.
Cho chuỗi:
txt = '[abc] {abc} abc (abc) [abc]'
Viết biểu thức chính quy tìm các chuỗi
trong dấu ngoặc vuông và thay thế chúng bằng
'!'.