正则表达式提取推文中的@name符号

0 投票
10 回答
1194 浏览
提问于 2025-04-15 19:54

我想用正则表达式从下面这句话中提取出 @patrick @michelle 这两个部分:

@patrick  @michelle we having diner @home tonight do you want to join?

注意:@home 不应该被包含在结果中,因为它既不是句子的开头,也没有后面跟着另一个 @name

任何解决方案、建议或评论都非常感谢。

10 个回答

0

也许可以这样做,不过你需要把匹配到的内容按空格分开,这样才能提取出多个ID。

/^\s*(@\w+\s+)*\s+.*$/
1

一开始我以为这个失败是因为我查看了返回的组:

>>> tw = re.compile(r"^((@\w*)\s+)*")
>>> tw.findall(tweet)
[('@michelle ', '@michelle')]
>>> tw.match(tweet).groups()
('@michelle ', '@michelle')

注意,这些组只保留了正则表达式中每个组的最后一个值。不过,如果你直接使用group(),那么你会得到整个匹配的字符串:

>>> tw.match(tweet).group()
'@patrick  @michelle '

为了好玩,我来试试pyparsing:

>>> from pyparsing import Word, printables, OneOrMore
>>> atName = Word("@",printables)
>>> OneOrMore(atName).parseString(tweet).asList()
['@patrick', '@michelle']
4
/(?:(?:@\S+\s+)+|^)@\S+/g

这个规则首先会找到一个“@”符号,后面跟着很多不是空格的字符,或者是行的开头,然后再找到另一个“@”符号,后面同样跟着很多不是空格的字符。

在Twitter上,通常情况下,@name 前面会有 RT,而且它可能出现在推文的中间或结尾,比如这个链接:http://twitter.com/ceetee/statuses/9874073403。简单来说,仅仅通过正则表达式或者解析器,你无法判断一个 @name 是否真的是一个名字。最好的办法是检查一下 http://twitter.com/name 是否返回404错误。

撰写回答