#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 —