Замена строки - Неизвестный флаг в позиции

Мои данные выглядят так:

df.head()

CLUID   STEP
9995    1998-10-27-03.18.54.256142  orders/sign()
9996    9012-03-22-00.56.55.724614  settings/user(?section=:section)
9997    9012-03-22-00.56.55.724614  settings/plugins
9998    1998-10-27-03.18.54.256142  saving/transactions
9999    9012-03-22-00.56.55.724614  settings/electronicstorage

Я хочу удалить определенную подстроку из столбца STEP.

Я пробовал:

df['STEP'] = df['STEP'].replace({'(?section=:section)': ''}, regex=True)

который поднимает:

ошибка: неизвестный флаг в позиции 3

Ожидаемый результат:

CLUID   STEP
9995    1998-10-27-03.18.54.256142  orders/sign()
9996    9012-03-22-00.56.55.724614  settings/user
9997    9012-03-22-00.56.55.724614  settings/plugins
9998    1998-10-27-03.18.54.256142  saving/transactions
9999    9012-03-22-00.56.55.724614  settings/electronicstorage

Помощь приветствуется.

Пожалуйста, опубликуйте ожидаемый результат.

Mayank Porwal 15.12.2020 16:18

Как спрашивает @MayankPorwal: чего бы вы хотели? Пожалуйста отредактируйте ожидаемый результат в вопросе.

tevemadar 15.12.2020 16:26

@MayankPorwal Отредактировано.

Stanislav Jirák 15.12.2020 16:29

Попробуйте без regex=True.

tevemadar 15.12.2020 16:33

@tevemadar Это ничего не делает. Уже пробовал раньше.

Stanislav Jirák 15.12.2020 16:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
190
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

документы

(?aiLmsux)
(Одна или несколько букв из набора «а», «и», «л», «м», «с», «у», «х».) [...]

(а еще есть (?aiLmsux-imsx:...))

Вот почему 3-я позиция неверна, (?s на позициях 0-1-2 может быть что-то правильное, а следующее e нет. (?section=:section) не является допустимым регулярным выражением.


replace() ищет точную строку (а не подстроку) без регулярного выражения, поэтому вам нужно регулярное выражение, просто экранируйте управляющие символы:

import pandas
df=pandas.DataFrame({"CLUID":["1998-10-27-03.18.54.256142","9012-03-22-00.56.55.724614","9012-03-22-00.56.55.724614"],
                     "STEP":["orders/sign()","settings/user(?section=:section)","settings/plugins"]})
print(df)
df['STEP'] = df['STEP'].replace({'\(\?section=:section\)': ''}, regex=True)
print(df)

Я вижу, что это на пару минут позже, но стоит упомянуть, что скобки тоже нужно экранировать.

Но как мне с этим справиться? Есть ли обходной путь?

Stanislav Jirák 15.12.2020 16:22

@StanislavJirák Пока я не мог сказать, что должен делать код.

tevemadar 15.12.2020 16:23

Я хочу удалить подстроку, как указано выше, из столбца.

Stanislav Jirák 15.12.2020 16:25
Ответ принят как подходящий

Использование re.sub может помочь. Обратная косая черта обрабатывает символ '?' как спец.

import pandas as pd

df = pd.DataFrame({'STEP': ["settings/user(?section=:section)", "orders/sign(/:orderIds)"]})

df['STEP'].apply(lambda x: re.sub('(\?section=:section)', '', str(x)))

На самом деле это работает и с replace:

df['STEP'] = df['STEP'].replace({'(\?section=:section)': ''}, regex=True)

Другие вопросы по теме