@name符号我想用正则表达式来仅@patrick @michelle
从下面的句子中提取:正则表达式来提取鸣叫
@patrick @michelle we having diner @home tonight do you want to join?
注:@home
不应该包括在结果,因为它不是在句子的开头,也没有跟着另一个@name
。
任何解决方案,提示,意见将非常感激。
@name符号我想用正则表达式来仅@patrick @michelle
从下面的句子中提取:正则表达式来提取鸣叫
@patrick @michelle we having diner @home tonight do you want to join?
注:@home
不应该包括在结果,因为它不是在句子的开头,也没有跟着另一个@name
。
任何解决方案,提示,意见将非常感激。
/(?:(?:@\S+\s+)+|^)@\S+/g
它首先匹配或者一个“@”,然后许多非空格字符,或行的开始,然后匹配的其它“@”后随许多非空格字符。
请注意,在推特上@name
之前有RT
,它出现在推文的中间或末尾,例如, http://twitter.com/ceetee/statuses/9874073403。基本上,你不能区分@name是否真的只是使用RegEx或甚至解析器的名称。最好的办法是检查是否http://twitter.com/name
404。
@Gumbo:我认为Joey可能会更强大一些......如果只有一个名字,那么您的正则表达式不匹配 – Zaid 2010-03-02 13:21:53
只要它以@开头,并继续这些,我会在poweshell中测试它,所以一些正则表达式引擎有点不同。这也应在该行
年初赶上ñ名“^((@ \ w +)\ S)+”
在使用该RE之前,您需要在字符串中添加一个尾部空格,尽管,以处理字符串以@ @ foo结尾的情况。 – 2010-03-02 17:55:18
是的,如果字符串以at结尾。 \ s * – rerun 2010-03-02 20:07:10
也许这样的事情,但你必须拆就在空格什么匹配组提取多个ID。
/^\s*(@\w+\s+)*\s+.*$/
你已经标记了你的帖子c#,所以我假设你可以使用.NET Regex实现。使用.NET ,下面的正则表达式会做:
(?<![^@]\w+\s+)(@\w+)
这将匹配开头@什么话,没有他们之前有没有@一个字。 请注意,“晚餐@家@晚上8点”仍然会打破它,但。
有关更多详细信息,请参见here。
好了,起初我以为这失败了,因为我看着返回的群体:
>>> 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']
为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在句子的开头。
谢谢大家的快速回复。
在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";
这应该在任何数量的初始@字符串中都是健壮的。
对于Python退房:http://github.com/BonsaiDen/AtarashiiFormat
它也会给你链接和标签。
,并用简单的regex的提防,你会最终有一个很大的混乱,因为我做之前,我转换了Twitter文字Java库。
对于C#,我会做如下:
@([A-ZA-Z0-9-_ &;] +)
如果'@ home' *被*后跟另一个'@name ',这两个*值将被视为名字,还是只是第一个?您是否知道您的规则与人们实际使用Twitter的方式不符? – 2010-03-02 17:06:23