【问题标题】:regular expression to extract @name symbols from tweet从推文中提取@name符号的正则表达式
【发布时间】:2011-01-22 17:26:22
【问题描述】:

我想用正则表达式从下面的句子中只提取@patrick @michelle

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

注意:@home 不应包含在结果中,因为它不在句子的开头,后面也没有另一个 @name

任何解决方案、提示、cmets 将不胜感激。

【问题讨论】:

  • 如果@home 后跟另一个@name两个 值会被视为名称,还是只是第一个?您是否知道您的规则与人们实际使用 Twitter 的方式不符?

标签: c# php python regex perl


【解决方案1】:

试试这个正则表达式:

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

\s 表示空白字符,\w 表示单词字符。

【讨论】:

  • @Gumbo:我认为乔伊可能会追求更强大的东西......如果只有一个名字,你的正则表达式将不匹配
【解决方案2】:

只要它以 @ 开头并以 @ 开头并继续这些,我就在 poweshell 中对其进行了测试,因此一些正则表达式引擎有点不同。这也应该在行首捕获 n 个名称

"^((@\w+)\s)+"

【讨论】:

  • 不过,在使用 RE 之前,您需要在字符串中添加一个尾随空格,以处理字符串以 @foo 结尾的情况。
【解决方案3】:

也许是这样,但您必须在匹配组中的任何空白处拆分以提取多个 id。

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

【讨论】:

    【解决方案4】:
    /(?:(?:@\S+\s+)+|^)@\S+/g
    

    它首先匹配一个 "@" 后跟许多非空格字符,或者匹配行首,然后匹配另一个 "@" 后跟许多非空格字符。

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

    【讨论】:

    • 这似乎效果很好,但仅适用于 2。如何扩展它以匹配句子开头的 n @name。输入:@patrick @michelle @john @Ted 我们今晚要吃晚餐@home 你想加入吗?
    • 感谢 Kenny,这正是我想要的 在 python 中实现 import re msg = 'comes here' re.findall('(?:(?:@\S+\s+)+|^)@ \S+', 味精)
    • 问题是,测试“@home”返回 404,但它也不是 Twitter 帐户名。
    【解决方案5】:

    您已标记您的帖子 c#,因此我假设您可以使用 .NET Regex 实施。 使用 .NET,下面的 Regex 就可以了:

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

    这将匹配任何以@ 开头的单词,并且在它们之前没有没有@ 的单词。 请注意,“dinner @home @8pm”仍然会破坏它。

    更多详情请见here

    【讨论】:

      【解决方案6】:

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

      >>> 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']
      

      【讨论】:

        【解决方案7】:

        对于 PHP

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

        感谢肯尼姆

        在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。

        感谢大家的快速回复。

        【讨论】:

          【解决方案8】:

          在 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 中都是健壮的。

          【讨论】:

            【解决方案9】:

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

            并且当心使用简单的正则表达式,你最终会弄得一团糟,就像我在转换 Twitter 文本 Java 库之前所做的那样。

            【讨论】:

              【解决方案10】:

              对于 C#,我会这样做:

              @([A-Za-z0-9-_&;]+)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-04-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-10-08
                相关资源
                最近更新 更多