#python #regex
#питон #регулярное выражение #python
Вопрос:
У меня есть следующий код в ipython. Я ожидаю, что с тех пор он удалит начало «ab». *? является нежадным человеком. Но почему он удаляется полностью, вплоть до последнего b?
In [15]: b="abcabcabc"
In [16]: re.sub(".*?b","",b)
Out[16]: 'c'
Ответ №1:
Это потому, что по умолчанию re.sub()
будет искать и заменять все вхождения
>>> import re
>>> b="abcabcabc"
>>> re.sub(".*?b","",b)
'c'
>>> re.sub("^.*?b","",b)
'cabcabc'
>>> re.sub(".*?b","",b, count=1)
'cabcabc'
>>> re.sub(".*?b","",b, count=2)
'cabc'
Из документа
re.sub(pattern, repl, string, count=0, flags=0)
Ответ №2:
В документах python говорится:
Необязательный аргумент count — это максимальное количество заменяемых вхождений шаблона; count должно быть неотрицательным целым числом. Если опущено или равно нулю, все вхождения будут заменены
Итак, вы можете вызвать re.sub
with count=1
, чтобы получить желаемый результат:
re.sub(".*?b", "", b, 1)
#output
'cabcabc'