正则表达式从tweet中提取@name符号

时间:2010-03-02 13:15:02

标签: c# php python regex perl

我想使用正则表达式从以下句子中仅提取@patrick @michelle

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

注意:@home不应包含在结果中,因为它不在句子的开头,也不在其他@name之后。

任何解决方案,提示,评论都将非常感激。

10 个答案:

答案 0 :(得分:4)

/(?:(?:@\S+\s+)+|^)@\S+/g

首先匹配“@”后跟许多非空格字符或行的开头,然后匹配另一个“@”后跟许多非空格字符。

请注意,在Twitter中常见的是@name前面有RT,出现在推文的中间或末尾,例如http://twitter.com/ceetee/statuses/9874073403。基本上你无法区分@name是否真的只是使用RegEx或甚至解析器的名称。最好的办法是检查是否http://twitter.com/name 404。

答案 1 :(得分:1)

嗯,起初我认为这失败了,因为我查看了返回的组:

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

请注意,组仅保留re中任何组的最后一个值。但是如果你只是抓住group(),那么你得到整个匹配的字符串:

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

对于笑容,我会尝试pyparsing:

>>> from pyparsing import Word, printables, OneOrMore
>>> atName = Word("@",printables)
>>> OneOrMore(atName).parseString(tweet).asList()
['@patrick', '@michelle']

答案 2 :(得分:0)

试试这个正则表达式:

/^\s*@(\w+)\s+@(\w+)/

\s表示空白字符和\w字符。

答案 3 :(得分:0)

只要它以@开头并继续执行,我会在poweshell中测试它,所以一些正则表达式引擎有点不同。这也应该在行的开头记下n个名字

“^((@ \ W +)\ S)+”

答案 4 :(得分:0)

也许是这样的,尽管你必须在匹配组中的任何空格上拆分以提取多个ID。

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

答案 5 :(得分:0)

您已将帖子标记为c#,因此我假设您可以使用.NET Regex实现。 使用.NET,以下Regex将执行:

(?<![^@]\w+\s+)(@\w+)

这将匹配任何以@开头的单词,这些单词在没有@之前没有单词。 请注意,“晚餐@home @ 8pm”仍将打破它。

有关详细信息,请参阅here

答案 6 :(得分:0)

for PHP

/^\s*@(\w+)\s+@(\w+)/

感谢KennyM

在python中

msg = '@patrick  @michelle we having diner @home tonight do you want to join?'
import re
re.findall('(?:(?:@\S+\s+)+|^)@\S+', msg)

这适用于句子开头的1或n @name。

谢谢大家的快速回复。

答案 7 :(得分:0)

在Perl中,您可以利用/g match-more-than-once修饰符和\G零宽度where-we-left-off断言和列表上下文,因此:

my $str = '@patrick  @michelle we having diner @home tonight do you want to join?';
my @matches = ($str =~ m/\G(\@\w+)\s*/g);

print join(', ', @matches) . "\n";

这应该适用于任意数量的初始@ -strings。

答案 8 :(得分:0)

对于Python,请查看:http://github.com/BonsaiDen/AtarashiiFormat
它还会为您提供链接和标签。

谨防使用一个简单的正则表达式,你最终会变得很乱,就像我在转换Twitter Text Java Library之前所做的那样。

答案 9 :(得分:0)

对于C#,我会这样做:

@([A-ZA-Z0-9 -_&安培;;] +)

相关问题