Как сопоставить строку определенного шаблона, но исключить один конкретный шаблон?

#python #regex #pandas

#python #регулярное выражение #панды

Вопрос:

Я новичок в python. Мне нужно сопоставить имена столбцов фрейма данных pandas, который имеет вид : names_(one more additional word)

Но из этого совпадения мне нужно пропустить одно конкретное имя столбца names_info

Предположим, что имена столбцов данных следующие

 "names_full" "names_first" "names_last" "names_attribute" "names_info" "address" "pin" "balance"
  

Мне удается так много писать на python:

 colnames.str.contains(r"(names_)")
  

и он выдает все столбцы с «names_» в начале. Из этого, как пропустить один конкретный случай?
Я новичок в регулярных выражениях, поэтому, пожалуйста, объясните логику, если это возможно

Ответ №1:

Вы могли бы использовать отрицательный прогноз, который утверждает, что определенные термины не следуют после names_ , например

 colnames.str.contains(r"names_(?!item$)")
  

Это будет соответствовать каждому имени столбца, за исключением names_item (хотя оно будет совпадать names_items ).

Используемый здесь шаблон регулярных выражений говорит о соответствии:

 names_     column name starts with "names_"
(?!item$)  what immediately follows is NOT "item"
  

Обратите внимание, что names_items это допустимо, а также все остальное, за которым item следует один или несколько символов.

Комментарии:

1. Привет, спасибо. Могу ли я узнать логику для ?,! и $ внутри ‘()’?

2. Позвольте мне добавить кое-что явно к моему ответу.

3. Привет, какова логика этого негативного прогноза?

4. Извините, форматирование было отключено. Проверьте обновленный ответ.

5. так ?! something переводится как Not «что-то»?