Странное поведение с 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'
Другие вопросы по тегам