re.sub (". *", "," (replace) "," text ") удваивает замену на Python 3.7 - PullRequest
0 голосов
/ 15 февраля 2019

В Python 3.7 (протестировано в 64-разрядной версии Windows) замена строки с использованием RegEx .* приводит к повторному вводу строки!

В Python 3.7.2:

>>> import re
>>> re.sub(".*", "(replacement)", "sample text")
'(replacement)(replacement)'

В Python 3.6.4:

>>> import re
>>> re.sub(".*", "(replacement)", "sample text")
'(replacement)'

В Python 2.7.5 (32 бита):

>>> import re
>>> re.sub(".*", "(replacement)", "sample text")
'(replacement)'

Что не так?Как это исправить?

1 Ответ

0 голосов
/ 15 февраля 2019

Это не ошибка, а исправление ошибки в Python 3.7 из коммита fbb490fd2f38bd817d99c20c05121ad0168a38ee .

В регулярном выражении сопоставление, отличное от нуля, перемещает позицию указателя в конецсовпадения, так что следующее утверждение, нулевой ширины или нет, может продолжать совпадать с позиции, следующей за совпадением.Таким образом, в вашем примере, после того, как .* жадно сопоставляет и использует всю строку, тот факт, что указатель затем перемещается в конец строки, все еще фактически оставляет «пространство» для совпадения с нулевой шириной в этой позиции, что может бытьЭто видно из следующего кода, который ведет себя одинаково в Python 2.7, 3.6 и 3.7:

>>> re.findall(".*", 'sample text')
['sample text', '']

Таким образом, исправлена ​​ошибка, связанная с заменой соответствия нулевой ширины сразу после ненулевой ширины.match, теперь корректно заменяет оба совпадения текстом замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...