Странное поведение с Python 3 re.sub
Следующий код:
import re
print(re.sub('[^a-zA-Z0-9]', '', ',Inc.', re.IGNORECASE).lower())
print(re.sub('[^a-zA-Z0-9]', '', ', Inc.', re.IGNORECASE).lower())
производит:
inc
inc.
https://repl.it/repls/RightThankfulMaintenance
Зачем?
1 ответ
Решение
Из DOCO, тоre.sub
подпись:
re.sub(pattern, repl, string, count=0, flags=0)
Итак, давайте рассмотрим ваш звонок на основе этого:
re.sub('[^a-zA-Z0-9]', '' , ', Inc.', re.IGNORECASE) # default
# < pattern > <repl> <string> < count > <flags>
Вы передаете флаг re.IGNORECASE
(имеет значение 2
если ты print(int(re.IGNORECASE))
, хотя я подозреваю, что это нигде не предписано) как счетчик для использования.
Таким образом, он выполняет до двух замен, то есть запятую и пробел в начале вашего второго примера. То же самое и в вашем первом примере, просто совпадал только один символ, а не три, так что вы не заметили.
Вместо этого вы должны использовать:
>>> re.sub('[^a-zA-Z0-9]', '', ', Inc.', flags=re.IGNORECASE).lower()
'inc'