re.sub с подстрокой, заканчивающейся разными номерами - PullRequest
0 голосов
/ 26 марта 2019

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

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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 26 марта 2019

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

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

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

Regex demo | Python demo

^Q\d+[a-zA-Z0-9]*_[a-zA-Z0-9]+ +- +

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

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

Примечание. Вместо пробела можно использовать \s, но обратите внимание, что оно также будет соответствовать новой строке.

Например:

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

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

^Q\d+[^_]*_\S+ +- +

Regex demo

0 голосов
/ 26 марта 2019

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

s = "Q1_1 - How old are you?"

re.sub(r"^Q\d+(_\d+)? +- +", "", s)

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

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

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

  • Q1 -
  • Q1_1 -
  • Q12 -
  • Q12_12 -
0 голосов
/ 26 марта 2019
import os

s = 'Q1_1 - How old are you?'
print(re.sub(r'^.*Q\d+_\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?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...