Как использовать положительные взгляды для извлечения подстроки из строки, следующей за словом «named» - PullRequest
1 голос
/ 26 марта 2019

У меня есть серия текстов от панд.Твиты о собаках.Некоторые из твитов содержат имя собаки.Имя отображается следующим образом."... бла-бла-бла по имени имя . бла-бла-бла ..." Неизвестное количество символов до и после нужного мне произведения.Я хочу извлечь имя .

Я считаю, что мне нужно использовать положительные взгляды за утверждениями и опцию поиска регулярных выражений.Я посмотрел документацию для re.search, а также следующие вопросы SO: Как извлечь подстроку между двумя маркерами? и Захваченные Regex группы с положительным lookbehind (python) , а также этот урок https://www.rexegg.com/regex-lookarounds.html. Я все еще чувствую себя застрявшим.

У меня есть две идеи:

A)

tweet = 'This is a Shotokon Macadamia mix named Cheryl. Sophisticated af.'
m = re.search('(?<=named)[A-Z][a-z]+', tweet)
m.group(0)

B)

s.str.extract(^named([A-Z][a-z])\.$)

Согласно документации, A) должен вернуть 'Cheryl', но я получаю ошибку атрибута: AttributeError: 'NoneType' object has no attribute 'group'.

B) работает только для серии, и не каждый элемент в серии твитов содержит "... named имя .»состав.Я не уверен, как включить это в код, чтобы он возвращал Шерил.

Ответы [ 2 ]

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

Питоны говорят, что m - это 'NoneType' object, потому что регулярное выражение не соответствует ни одной строке, поэтому вы не можете извлечь группу из ее результата. Для получения правильного соответствия вы должны добавить пробел после имени. Поэтому просто попробуйте:

(?<=named )[A-Z][a-z]+

См. Также https://regex101.com/r/nZiAFN/1

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

Следующее регулярное выражение извлекает только имя, которое появляется после именованной строки:

m = re.search('(?<=named\s)(\w+)', tweet)
...