
Изучал регулярные вытажения по надобности и столкнулся с такой проблемой: есть строка text='event=20&page=1&event'
, на выходе пытаюсь получить text='event=20&page=%s&event'
, то есть заменить именно эту цифру 1
на %s
.
Пытался делать через функцию re.sub:
text='event=20&page=1&event' new_text = re.sub(r"/page=(\d+)/$", '%s', text)
2Answers

Еще может заинтересовать:

А зачем вам эти странные /
и $
здесь нужны? Черточки долой, конец строки тоже.
Забыл как выкидывать строку из поиска, поэтому с небольшим хаком вариант:
new_text = re.sub(r"\bpage=(\d+)", 'page=%s', text)
\b
— чтобы строки типа current_page
отбросить
UPD:
Нашел как отбросить строку из поиска:
new_text = re.sub(r"(?<=\bpage=)(\d+)", '%s', text)
Конструкция вида (?<=шаблон)шаблон_для_поиска
используется для позитивного просмотра назад, подробнее лучше почитать в википедии
И еще - меня несколько смущает наличие у вас и отсутствие у меня конца строки в поиске. Может быть вы хотели указать не конец строки, а конец слова? Т.е. page=123a
не должно заменяться на page=%sa
? Тогда надо несколько изменить регулярку:
new_text = re.sub(r"(?<=\bpage=)(\d+)\b", '%s', text)

В Питоне есть парсер для таких (url query) строк:
from urllib.parse import parse_qs query_string = 'event=20&page=1&event' params = parse_qs(query_string, keep_blank_values=True) # -> {'event': ['20', ''], 'page': ['1']}
Если порядок важен, то можно использовать parse_qsl()
функцию, которая возвращает список пар:
имя -> значение.
Чтобы собрать новый запрос, вместо строкового форматирования %s
, можно использовать urlencode()
:
from urllib.parse import urlencode params['page'] = ['what&ever'] new_query_string = urlencode(params, doseq=True) # -> 'event=20&event=&page=what%26ever'
Если есть возможность, то следует использовать специализированные инструменты по сравнению с более общими регулярными выражениями и строковым форматированием, чтобы не изобретать велосипед.
В Python 2 эти функции в других модулях: urlparse.parse_qs()
, urllib.urlencode()
.