#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. Группа захвата (заключенная в круглые скобки) объединяет текст, соответствующий регулярному выражению внутри них, в нумерованную группу