re.sub с подстрокой, заканчивающейся разными числами

#python #regex

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

Вопрос:

Есть куча меток переменных, которые я пытаюсь очистить.

Каждая строка начинается с номера вопроса, такого как «Q1_1 — Сколько тебе лет?»

Я хочу удалить все до начала вопроса.

ввод: "Q1_1 - How old are you?"

вывод: "How old are you?"

Новичок в использовании re.sub и понимаю, как использовать его в каждом конкретном случае, но для более чем 40 переменных одновременно я в растерянности и не смог найти в Интернете ничего, что работало.

Нашел этот код в Интернете, и он просто заменил символ с ‘_’ на ‘-‘:

 re.sub('/.*- / ','',myvarlabel)
  

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

1. Почему регулярное выражение? s.split('-')[1].strip() (предполагая, что вопрос не содержит - ).

2. @Austin Вопрос может содержать, - если вы просто добавите maxsplit=1 аргумент к split методу.

Ответ №1:

Ваш шаблон использует жадный квантификатор для точки .* , что может привести к широкому совпадению.

Если каждая строка начинается с вашего шаблона, вы также можете использовать привязку ^ для подтверждения начала строки.

Для вашего примера строки вы могли бы получить более точное соответствие, используя этот шаблон, а затем заменить пустой строкой.

Демонстрация регулярных выражений | Демонстрация Python

 ^Qd [a-zA-Z0-9]*_[a-zA-Z0-9]   -  
  

Это будет соответствовать

  • ^ Начало строки
  • Qd Сопоставьте Q, за которым следует 1 цифр
  • [a-zA-Z0-9]* Сопоставьте любой из перечисленных в классе символов 0 раз
  • _[a-zA-Z0-9] Сопоставьте подчеркивание, сопоставьте любой из перечисленных в классе символов 1 раз
  • - Сопоставьте 1 раз пробел, дефис, 1 раз пробел

Примечание: Вместо пробела вы могли бы использовать s , но обратите внимание, что это также соответствовало бы новой строке.

Например:

 re.sub(r"^Qd [a-zA-Z0-9]*_[a-zA-Z0-9]   -  ", "", "Q1_1 - How old are you?")
  

Или используйте класс отрицаемых символов, чтобы получить более широкое соответствие:

 ^Qd [^_]*_S   -  
  

Демонстрация регулярных выражений

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

1. Что, если Q может также содержать буквы. Например, Q1a_M.

2. @Stretch Вы могли бы использовать символьный класс и добавить к нему то, что вы позволили бы сопоставить с demo

3. @Stretch Вы также можете расширить символьный класс с помощью квантора regex101.com/r/4z1hkP/3 Я добавил обновление к своему ответу.

4. Q6b1_TN — Сколько тебе лет? Не будет работать в этом примере.

5. @Stretch Вы можете получить более широкое соответствие, используя regex101.com/r/4z1hkP/4 или также добавьте совпадающие цифры в первый класс символов regex101.com/r/4z1hkP/5

Ответ №2:

 import os

s = 'Q1_1 - How old are you?'
print(re.sub(r'^.*Qd _d s-s','',s))
  

Работает для этих:

 IN: Q21_2 - How old are you?
OUT: How old are you?

IN: 123 - Q21_2 - Q21_2 - How old are you?
OUT: How old are you?
  

Не будет соответствовать этому:

 IN: Q21_2 : How ol - d are you?
  

Ответ №3:

Чтобы удалить номер вопроса и [space]-[space] , ваш шаблон должен быть:

 s = "Q1_1 - How old are you?"

re.sub(r"^Qd (_d )?  -  ", "", s)
  

Это будет соответствовать

  • Q ,
  • Один или более digits 0-9
  • Необязательный один или несколько _digit
  • За которым следует - между пробелами

Это позволяет сопоставлять и удалять любое из следующих:

  • Вопрос 1 —
  • Q1_1 —
  • Q12 —
  • Q12_12 —