我想使用正则表达式从以下句子中仅提取@patrick @michelle
:
@patrick @michelle we having diner @home tonight do you want to join?
注意:@home
不应包含在结果中,因为它不在句子的开头,也不在其他@name
之后。
任何解决方案,提示,评论都将非常感激。
答案 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 -_&安培;;] +)