#python #regex
#python #регулярное выражение
Вопрос:
Я пытаюсь извлечь имя и профессию в виде списка кортежей из приведенной ниже строки, используя регулярное выражение.
Входная строка
text = "Mr John,Carpenter,Mrs Liza,amazing painter"
Как вы можете видеть, первое слово — это имя, за которым следует профессия, которая повторяется через запятую. Проблема в том, что я хочу избавиться от прилагательных, которые прилагаются к профессии. Например, «удивительно» в приведенном ниже примере.
Ожидаемый результат
[('Mr John', 'Carpenter'), ('Mrs Liza', 'painter')]
Я удалил прилагательное из текста, используя «заменить», и использовал приведенный ниже код, используя «регулярное выражение», чтобы получить результат. Но я ищу единственную функцию регулярного выражения, чтобы избежать выполнения замены строки. Я подумал, что это как-то связано с ожиданием в регулярных выражениях, но не смог заставить его работать. Любая помощь будет оценена.
text.replace("amazing ", "")
txt_new = re.findall("([ws] ),([ws] )",text)
Ответ №1:
Если вы хотите использовать только символы word и пробелов, это может быть другим вариантом:
(w (?:s w )*)s*,s*(?:w s )*(w )
Объяснение
(
Группа захвата 1w (?:s w )*
Сопоставьте символы 1 word и, при необходимости, повторите символы 1 пробелов и символы 1 word
)
Закрыть группу 1s*,s*
Сопоставьте запятую между необязательными символами пробела(?:w s )*
При необходимости повторите символы 1 word и 1 пробелов(w )
Группа захвата 2, сопоставьте символы 1 word
Демонстрация регулярных выражений | Демонстрация Python
import re
regex = r"(w (?:s w )*)s*,s*(?:w s )*(w )"
s = ("Mr John,Carpenter,Mrs Liza,amazing painter")
print(re.findall(regex, s))
Вывод
[('Mr John', 'Carpenter'), ('Mrs Liza', 'painter')]
Ответ №2:
Вот один из подходов к регулярному выражению, использующий re.findall
:
text = "Mr John,Carpenter,Mrs Liza,amazing painter"
matches = re.findall(r's*([^,] ?)s*,s*.*?(S )s*(?![^,])', text)
print(matches)
Это печатает:
[('Mr John', 'Carpenter'), ('Mrs Liza', 'painter')]
Вот объяснение шаблона регулярных выражений:
s* match optional whitespace
([^,] ?) match the name
s* optional whitespace
, first comma
s* optional whitespace
.*? consume all content up until
(S ) the last profession word
s* optional whitespace
(?![^,]) assert that what follows is either comma or the end of the input
Комментарии:
1. Большое спасибо @Tim Biegeleisen. Теперь я пытаюсь понять это 🙂
2. @sharathnatraj Мои чувства в точности. Вот почему я попытался добавить объяснение.
3. Итак, этот шаблон «.*?» избавляется от прилагательного? Итак, вы предполагаете, что за прилагательным всегда будет следовать пробел, верно?
4. Нет, предполагается, что прилагательное является последним словом после первой запятой, за которым следует либо другая запятая, либо конец ввода.