正则表达式提取推文中的@name符号
我想用正则表达式从下面这句话中提取出 @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错误。