使用正则表达式从 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 来处理您的函数返回的 &lt;re.Match&gt; 对象,因此它使用 @ 处理它987654326@。如果您想深入了解已处理的 dtype,请查看 this 很好的答案。

因此,假设您希望以最小的更改保持所有方法相同,这里是一个通过简单地返回每个 &lt;re.Match&gt; 对象的第一项 ([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 数据中提取用户名的主要内容,如果未能解决你的问题,请参考以下文章

Twitter用户名的正则表达式

Jmeter之正则表达式提取器应用

正则表达式从字符串中提取用户名/名称

使用正则表达式从 txt 中提取数据 [关闭]

如何使用正则表达式将特定的子字符串提取到新行中?

使用正则表达式在 IRC 日志中提取用户名?