Общие правила
В квадратных скобках указан любой отдельный символ.
Примерно [xyz]
- это сокращение для (x|y|z)
, но без создания группы .
Аналогично [a-z]
- это сокращение для (a|b|c|...|y|z)
.
Интерпретация наборов символов может быть немного хитрой. Начальная и конечная точки преобразуются в их порядковые позиции , и отсюда выводится диапазон совпадающих символов. Например, [A-z]
преобразует A в 65 и z в 122, поэтому все от 65 до 122 включено. Это означает, что он также соответствует символам, таким как ^ , которые конвертируются в 94. Это также означает, что такие символы, как ö , не будут совпадать, потому что они конвертируются в 246, что находится за пределами диапазона.
Другая интересная форма для классов символов использует ^ , чтобы инвертировать выделение. Например, [^a-z]
означает «любой символ, не находящийся в диапазоне от a до z .
Полная информация приведена в разделе« Наборы символов » re docs .
Специфика c Задача
В примере OP, BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]')
, символ ^ в начале инвертирует диапазон так, чтобы перечисленные символы были исключены из поиска.
Именно поэтому код не не заменил 0 , a и m , хотя в [ ]
был указан 0-9a-z
. По сути, он рассматривал указанные символы как хорошие символы.
Надеюсь, это поможет : -)