Извлечение имен пользователей из твитов без префикса @ или RT

#python #regex

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

Вопрос:

Я пытаюсь извлечь имена пользователей из твита без @ символа или RT префикса.

В настоящее время я использую Code 1 для этой цели, который не соответствует этому критерию, поэтому мне приходится прибегать к другому lambda , который очищает нежелательные символы.

Код 1:

 import pandas as pd
import re
tw = 'RT @uname1, RT @uname2 @uname3, text1, text2, @uname4, text3, @uname5, RT @uname6. '

retweet_pattern = re.compile(r'(RTs@[^,^s^.] )')
mention_pattern = re.compile(r'([^RT]s@[^,^s^.] )')

rt_unames, mt_unames = re.findall(retweet_pattern, tw), re.findall(mention_pattern, tw)
rt_unames, mt_unames
 

Вывод кода 1:

 (['RT @uname1', 'RT @uname2', 'RT @uname6'],
 ['2 @uname3', ', @uname4', ', @uname5'])
 

Затем я должен очистить выходные данные вторым lambda , как в Code 2 :

Код 2

 rt_unames, mt_unames = list(map(lambda x: x[4:], rt_unames)), list(map(lambda x: x[3:], mt_unames))
rt_unames, mt_unames
 

Вывод кода 2

 (['uname1', 'uname2', 'uname6'], ['uname3', 'uname4', 'uname5'])
 

Есть ли способ исправить мой re шаблон, чтобы RT 2 @ @ в выходных данных не отображались, и я бы избавился от второго lambda приложения?
Заранее спасибо

Ответ №1:

Вы можете использовать группы захвата или именованные группы захвата

 pattern = r"RTs @*(?P<name>[^s,.] )"
text = 'RT @uname1, RT @uname2 @uname3, text1, text2, @uname4, text3, @uname5, RT @uname6. '
 

вариант 1

 output1 = [x.group('name') for x in re.finditer(pattern, text)]
 

вариант 2

 output2 = re.findall(pattern, text)
 

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

1. Спасибо, это работает! Не могли бы вы объяснить шаблон и как он достигает желаемого результата? Я думаю, это та ?P<name> часть, которая выполняет эту работу.

2. (?P<name>[^s,.] ) является группой захвата. ?P<name> необязательно, это поможет вам получить доступ к группе по имени.

3. Группа захвата (заключенная в круглые скобки) объединяет текст, соответствующий регулярному выражению внутри них, в нумерованную группу