2010-03-02 129 views
0

@name符号我想用正则表达式来仅@patrick @michelle从下面的句子中提取:正则表达式来提取鸣叫

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

注:@home不应该包括在结果,因为它不是在句子的开头,也没有跟着另一个@name

任何解决方案,提示,意见将非常感激。

+2

如果'@ home' *被*后跟另一个'@name ',这两个*值将被视为名字,还是只是第一个?您是否知道您的规则与人们实际使用Twitter的方式不符? – 2010-03-02 17:06:23

回答

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

它首先匹配或者一个“@”,然后许多非空格字符,或行的开始,然后匹配的其它“@”后随许多非空格字符。

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

+0

这似乎很好,但只适用于2.如何将它扩展为在句子开头匹配n @name。 输入:@patrick @michelle @john @Ted我们有晚餐@home今晚你想加入吗? – Joey 2010-03-02 13:31:28

+0

@Joey:查看更新。 – kennytm 2010-03-02 13:33:37

+0

谢谢Kenny,这正是我想要的 python中的实现 import re msg ='come here' re.findall('(?:(?:@ \ S + \ s +)+ | ^)@ \ S +' ,msg) – Joey 2010-03-02 13:42:11

0

尝试此正则表达式:

/^\s*@(\w+)\[email protected](\w+)/ 

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

+0

@Gumbo:我认为Joey可能会更强大一些......如果只有一个名字,那么您的正则表达式不匹配 – Zaid 2010-03-02 13:21:53

0

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

年初赶上ñ名“^((@ \ w +)\ S)+”

+0

在使用该RE之前,您需要在字符串中添加一个尾部空格,尽管,以处理字符串以@ @ foo结尾的情况。 – 2010-03-02 17:55:18

+0

是的,如果字符串以at结尾。 \ s * – rerun 2010-03-02 20:07:10

0

也许这样的事情,但你必须拆就在空格什么匹配组提取多个ID。

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

你已经标记了你的帖子c#,所以我假设你可以使用.NET Regex实现。使用.NET ,下面的正则表达式会做:

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

这将匹配开头@什么话,没有他们之前有没有@一个字。 请注意,“晚餐@家@晚上8点”仍然会打破它,但。

有关更多详细信息,请参见here

1

好了,起初我以为这失败了,因为我看着返回的群体:

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

注意,组只保留最后的值在重新任何一组。但如果你只是抢到组(),那么你得到整个匹配的字符串:

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

对于笑容,我会尽力pyparsing:

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

为PHP

/^\s*@(\w+)\[email protected](\w+)/ 

谢谢KennyM

in 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在句子的开头。

谢谢大家的快速回复。

0

在Perl中,你可以利用的/g比赛更比一次修改与\G零宽度在那里,我们左断断言和列表环境相结合,即:

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"; 

这应该在任何数量的初始@字符串中都是健壮的。

0

对于Python退房:http://github.com/BonsaiDen/AtarashiiFormat
它也会给你链接和标签。

,并用简单的regex的提防,你会最终有一个很大的混乱,因为我做之前,我转换了Twitter文字Java库。

0

对于C#,我会做如下:

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