使用正则表达式从 Twitter 数据中提取用户名
Posted
技术标签:
【中文标题】使用正则表达式从 Twitter 数据中提取用户名【英文标题】:Using Regex for extracting Usernames from Twitter Data 【发布时间】:2020-06-17 15:48:27 【问题描述】:我正在尝试借助正则表达式从 Twitter 文本中提取姓名。但是,尽管有模式,但返回的值是 none,但情况并非如此。我的代码哪里错了,我不知道。我正在使用 jupyter 实验室。
示例文本是 pd.Series full_text
0 RT @SeamusHughes: The Taliban Stamp of approva...
1 RT @WFaqiri: Taliban and Afghan groups find co...
2 RT @DavidCornDC: Imagine what Fox News would h...
3 RT @DavidCornDC: Imagine what Fox News would h...
4 RT @billroggio: Even if you are inclined to tr...
5 RT @billroggio: I am sure we will hear the arg...
6 RT @KFILE: This did happen and it went exactly...
Name: full_text, dtype: object
我的函数定义如下:
def extract_user(text):
m = re.search(r"RT\s@\w+:", text)
return m
并且,我将上述功能应用如下:
full_text.apply(extract_user)
但我得到的回报如下:
0 None
1 None
2 None
3 None
4 None
...
21299 None
21300 None
21301 None
21302 None
21303 None
Name: full_text, Length: 21304, dtype: object
【问题讨论】:
re.search 返回匹配对象 与pandas
的语法几乎相同:full_text.str.match("RT\s@\w+:")
【参考方案1】:
发生这种情况的原因是因为您的函数 (extract_user
) 返回:
0 <re.Match object; span=(5, 22), match='RT @Sea...
1 <re.Match object; span=(5, 17), match='RT @WFa...
2 <re.Match object; span=(5, 21), match='RT @Dav...
3 ...
现在我不是专家,所以对此持保留态度,但我的猜测是 pandas 没有 dtype
来处理您的函数返回的 <re.Match>
对象,因此它使用 @ 处理它987654326@。如果您想深入了解已处理的 dtype,请查看 this 很好的答案。
因此,假设您希望以最小的更改保持所有方法相同,这里是一个通过简单地返回每个 <re.Match>
对象的第一项 ([0]
) 来修改函数的示例。
def extract_user(text):
m = re.search(r"RT\s@\w+:", text)
return m[0] # <-- here
stuff = df.iloc[:, 0].apply(extract_user)
print(stuff)
0 RT @SeamusHughes:
1 RT @WFaqiri:
2 RT @DavidCornDC:
3 RT @DavidCornDC:
4 RT @billroggio:
5 RT @billroggio:
6 RT @KFILE:
希望能澄清一些事情。
【讨论】:
谢谢!我也想通了,然后我用切片作为return m.group()[4:-1]
。【参考方案2】:
你可以用下面的代码做更多的事情
df.A.str.extract(r"(@\w+)") #A is the column name
输出
0
0 @SeamusHughes
1 @WFaqiri
2 @DavidCornDC
3 @DavidCornDC
4 @billroggio
5 @billroggio
6 @KFILE
如果您只想要名称而不想要 @
符号,请使用 df.A.str.extract(r"@(\w+)")
输出
0
0 SeamusHughes
1 WFaqiri
2 DavidCornDC
3 DavidCornDC
4 billroggio
5 billroggio
6 KFILE
【讨论】:
谢谢!你所有的代码都很棒,但如果有人能指出我的代码中的错误,我将非常感激。 在您的代码中re.search(r"RT\s@\w+:", text)
返回搜索对象,而不是值。打印m
和打印m.group()
以查看差异。
@ambrishdhaka (1) 使用 fulltext.str
而不是 fulltext
,然后 (2) 使用捕获组来获取实际文本。
@moys 我要向你学习这个m = re.search(r"RT\s@\w+:", text) print(m.group()[4:-1])
谢谢。【参考方案3】:
如何在其中使用 lambda 函数:
>>> df[0].apply(lambda text: re.search(r'RT\s@([^:]+)',text).group(1))
0 SeamusHughes
1 WFaqiri
2 DavidCornDC
3 DavidCornDC
4 billroggio
5 billroggio
6 KFILE
为了彻底,把它们放在一起:
import pandas as pd
data = [['RT @SeamusHughes: The Taliban Stamp of approva...'],['RT @WFaqiri: Taliban and Afghan groups find co...'],['RT @DavidCornDC: Imagine what Fox News would h...'],['RT @DavidCornDC: Imagine what Fox News would h...'],['RT @billroggio: Even if you are inclined to tr...'],['RT @billroggio: I am sure we will hear the arg...'],['RT @KFILE: This did happen and it went exactly...']]
df=pd.DataFrame(data)
df[0].apply(lambda text: re.search(r'RT\s@([^:]+)',text).group(1))
# 0 SeamusHughes
# 1 WFaqiri
# 2 DavidCornDC
# 3 DavidCornDC
# 4 billroggio
# 5 billroggio
# 6 KFILE
# Name: 0, dtype: object
【讨论】:
谢谢!匿名函数很棒,但是您使用的正则表达式字符串也应该在我的代码中工作。我尝试用你的替换它,但没有成功。以上是关于使用正则表达式从 Twitter 数据中提取用户名的主要内容,如果未能解决你的问题,请参考以下文章