Dấu gạch ngang bên trong tập hợp trong biểu thức chính quy Python
Dấu gạch ngang - cũng là một ký tự đặc biệt bên trong [ ]
(còn bên ngoài - thì không). Nếu bạn cần chính
dấu gạch ngang như một ký tự - hãy đặt nó ở vị trí
mà nó sẽ không bị hiểu là dấu phân cách
nhóm.
Tại sao điều này quan trọng: bạn có thể tạo ra một nhóm
ký tự mà chính bạn không nhận ra. Ví dụ,
như thế này - '[:-@]' - bạn nghĩ rằng
bạn đang chọn dấu hai chấm, dấu gạch ngang và dấu @, nhưng
thực tế lại tạo thành một nhóm ký tự giữa
: và @. Nhóm này bao gồm
các ký tự sau: ? < = > :
Chúng từ đâu ra? Từ bảng ASCII - dấu hai chấm có số thứ tự nhỏ hơn dấu @ - và kết quả là một nhóm. Tức là tất cả các nhóm được tạo ra dựa trên bảng ASCII (nếu muốn có thể sử dụng điều này).
Cách giải quyết: đặt ký tự
dấu gạch ngang ở vị trí mà chắc chắn nó sẽ không bị hiểu
là ký tự nhóm, ví dụ, ở đầu hoặc
ở cuối (tức là sau [hoặc trước
]).
Cũng có thể escape dấu gạch ngang - khi đó
nó sẽ biểu thị chính nó bất kể
vị trí. Ví dụ, thay vì [:-@]
viết [:\-@] - và sẽ không có
nhóm nữa, mà sẽ có ba ký tự - dấu hai chấm,
dấu gạch ngang và dấu @ @.
Ví dụ
Trong ví dụ sau, mẫu tìm kiếm như sau:
chữ số 1, sau đó là chữ cái từ 'a'
đến 'z', sau đó là chữ số 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Kết quả thực thi mã:
'! 1-2 ! !'
Ví dụ
Bây giờ hãy escape dấu gạch ngang.
Kết quả mẫu tìm kiếm như sau: chữ số
1, sau đó là chữ cái 'a', hoặc
dấu gạch ngang, hoặc chữ cái 'z', sau đó là chữ số
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Kết quả thực thi mã:
'! ! 1c2 !'
Ví dụ
Có thể chỉ cần đổi vị trí dấu gạch ngang, không cần escape nó:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Kết quả thực thi mã:
'! ! 1c2 !'
Ví dụ
Trong ví dụ tiếp theo, mẫu tìm kiếm như sau:
ký tự đầu tiên - là chữ cái thường hoặc
dấu gạch ngang '-', sau đó là hai chữ cái
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Kết quả thực thi mã:
'! Axx ! @xx'
Ví dụ
Trong ví dụ tiếp theo, mẫu tìm kiếm như sau:
ký tự đầu tiên - là chữ cái thường, chữ cái hoa
hoặc dấu gạch ngang '-', sau đó là hai chữ cái
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Kết quả thực thi mã:
'! ! ! @xx'
Ví dụ
Có thể đặt dấu gạch ngang giữa hai nhóm - ở đó chắc chắn nó sẽ không tạo thêm một nhóm nữa:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Kết quả thực thi mã:
'! ! ! @xx'
Bài tập thực hành
Cho chuỗi:
txt = 'xaz xBz xcz x-z x@z'
Tìm tất cả các chuỗi theo mẫu sau:
chữ cái 'x', chữ cái hoa hoặc thường
hoặc dấu gạch ngang, chữ cái 'z'.
Cho chuỗi:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Tìm tất cả các chuỗi theo mẫu sau:
chữ cái 'x', sau đó là dấu đô la, hoặc
dấu gạch ngang hoặc dấu cộng, sau đó là chữ cái 'z'.