【问题标题】:regex for Twitter usernameTwitter用户名的正则表达式
【发布时间】:2011-01-19 06:20:31
【问题描述】:

您能否提供一个匹配 Twitter 用户名的正则表达式?

如果提供 Python 示例,将获得额外奖励。

【问题讨论】:

  • Twitter 用户名有哪些限制?
  • 请参阅@rayfranco 的回答了解规格。

标签: python regex twitter


【解决方案1】:
(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9-_]+)

我使用它是因为它忽略了电子邮件。

这是一个示例推文:

@你好@你好吗@my_friend,给我发电子邮件@000 @whats.up@example.com @shahmirj

匹配:

  • @你好
  • @你
  • @my_friend
  • @shahmirj

它也适用于主题标签,我使用相同的表达式,将 @ 更改为 #

【讨论】:

  • 非常好!只有一个更正:hastags 和 screenNames 可以有两个下划线。我会以这种方式添加它,生成的正则表达式是: (?\.]))#([A-Za-z ]+[A-Za-z0-9-]+)
  • 另外,下划线可以在用户名的开头:(?
  • 将答案应用于'RT @daddy_san: RIGHT IN THE FEELS BRUH 只会得到@daddy 作为答案。
  • 试试(?&lt;=^|(?&lt;=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)
  • @000 以及带有下划线的屏幕名称(如@backslash17 和@fixxxer 所述)都应该被捕获。并且它不会仅仅通过简单地将 @ 替换为 # 来捕获主题标签,因为主题标签也可以包含 unicode。所以提及的表达式应该是(?&lt;=^|(?&lt;=[^a-zA-Z0-9-\.]))@([A-Za-z0-9_]+)
【解决方案2】:

如果你在谈论他们在 twitter 上使用的 @username 东西,那么你可以使用这个:

import re
twitter_username_re = re.compile(r'@([A-Za-z0-9_]+)')

要使每个实例都成为 HTML 链接,您可以执行以下操作:

my_html_str = twitter_username_re.sub(lambda m: '<a href="http://twitter.com/%s">%s</a>' % (m.group(1), m.group(0)), my_tweet)

【讨论】:

  • 有官方规范吗?
  • 不,但我知道 Twitter 用户名可以包含字母数字和下划线,如果它们确实允许其他任何内容,那么在野外并不常见。
  • 我爱你,但这是不对的。是的,但它也会接收电子邮件地址,而 twitter 不会这样做。
  • 捕获电子邮件地址。使用正则表达式 (?\\.]))@([A-Za-z]+[A-Za-z0-9]+) 来自下面的 Angel.King.47。
【解决方案3】:

我使用的正则表达式已经在多个上下文中进行了测试:

/(^|[^@\w])@(\w{1,15})\b/

这是我发现的在字符串中测试和替换 Twitter 用户名的最简洁方法。

#!/usr/bin/python

import re

text = "@RayFranco is answering to @jjconti, this is a real '@username83' but this is an@email.com, and this is a @probablyfaketwitterusername";

ftext = re.sub( r'(^|[^@\w])@(\w{1,15})\b', '\\1<a href="http://twitter.com/\\2">\\2</a>', text )

print ftext;

这将按预期返回我:

<a href="http://twitter.com/RayFranco">RayFranco</a> is answering to <a href="http://twitter.com/jjconti">jjconti</a>, this is a real '<a href="http://twitter.com/username83">username83</a>' but this is an@email.com, and this is a @probablyfaketwitterusername

基于Twitter specs

您的用户名不能超过 15 个字符。您的真实姓名可以更长(20 个字符),但为方便起见,用户名会保持较短。 如上所述,用户名只能包含字母数字字符(字母 A-Z,数字 0-9),下划线除外。检查以确保您想要的用户名不包含任何符号、破折号或空格。

【讨论】:

  • 最干净的。很好的规范发布。
  • 谢谢,太好了! ...除了它不正确地匹配中等 URL 中的用户名,例如medium.com/@p5d12000/xyz。这是一个修改后的版本:(^|[^\w@/\!?=&amp;])@(\w{1,15})\b。 (Twitter 本身还是更好的——它正确地自动链接了 /@abc 中的 @-mention,以及 https://medium.com/@abc 中的完整 URL——但是哦。)
【解决方案4】:

Twitter recently releasedopen source 使用各种语言,包括 Java、Ruby (gem) 和用于查找用户名、哈希标签、列表和 URL 的代码的 Javascript 实现。

它非常面向正则表达式。

【讨论】:

    【解决方案5】:

    表单中接受的唯一字符是 A-Z、0-9 和下划线。 用户名不区分大小写,因此您可以使用r'@(?i)[a-z0-9_]+' 正确匹配所有内容并区分用户。

    【讨论】:

    • 它们不区分大小写并没有太大区别。 (?i) 指的是您的模式,而不是您捕获的值。将 ABC 和 Abc 处理为相同的值仍然取决于程序。
    【解决方案6】:

    这是我在一个项目中使用的一种方法,它采用推文对象的文本属性并返回带有主题标签和 user_mentions 的文本,链接到 twitter 上的相应页面,符合最新的 twitter 显示指南

    def link_tweet(tweet):
    """
    This method takes the text attribute from a tweet object and returns it with
    user_mentions and hashtags linked
    """
    tweet = re.sub(r'(\A|\s)@(\w+)', r'\1@<a href="http://www.twitter.com/\2">\2</a>', str(tweet))
    return re.sub(r'(\A|\s)#(\w+)', r'\1#<a href="http://search.twitter.com/search?q=%23\2">\2</a>', str(tweet))
    

    调用此方法后,您可以传入参数 my_tweet[x].text。希望这会有所帮助。

    【讨论】:

    • 忘了提到这只会接收@mentions 和#tags,而不是电子邮件。
    【解决方案7】:

    更短,/@([\w]+)/ 工作正常。

    【讨论】:

    • 您缺少 '' 和带有重音符号的字符。在 Python 中添加等效的 \p{L} 和 ''
    • 它们通常包含在 Twitter 上的用户名中吗?我认为他不需要监视他们。当然,我猜这会增加灵活性
    【解决方案8】:

    这个正则表达式似乎可以解决 Twitter 用户名:

    ^@[A-Za-z0-9_]{1,15}$
    

    最多 15 个字符,允许在 @ 之后直接使用下划线(Twitter 这样做),并允许所有下划线(在快速搜索后,我发现 Twitter 显然也这样做)。不包括电子邮件地址。

    【讨论】:

      【解决方案9】:

      如果您需要匹配所有 handle@handletwitter.com/handle 格式,这是一个变体:

      import re
      
      match = re.search(r'^(?:.*twitter\.com/|@?)(\w{1,15})(?:$|/.*$)', text)
      handle = match.group(1)
      

      此处的说明、示例和工作正则表达式: https://regex101.com/r/7KbhqA/3

      匹配

      myhandle
      @myhandle
      @my_handle_2
      twitter.com/myhandle
      https://twitter.com/myhandle
      https://twitter.com/myhandle/randomstuff
      

      不匹配

      mysuperhandleistoolong
      @mysuperhandleistoolong
      https://twitter.com/mysuperhandleistoolong
      

      【讨论】:

        【解决方案10】:

        您可以使用以下正则表达式:^@[A-Za-z0-9_]{1,15}$

        在python中:

        import re    
        pattern = re.compile('^@[A-Za-z0-9_]{1,15}$')
        pattern.match('@Your_handle')
        

        这将检查字符串是否与正则表达式完全匹配。

        在“实用”设置中,您可以按如下方式使用它:

        pattern = re.compile('^@[A-Za-z0-9_]{1,15}$')
        if pattern.match('@Your_handle'):
            print('Match')
        else:
            print('No Match')
        

        【讨论】:

          【解决方案11】:

          我已使用现有答案并针对我的用例进行了修改。 (用户名必须超过 4 个字符)

          ^[A-z0-9_]{5,15}$
          

          规则:

          • 您的用户名必须超过 4 个字符。
          • 您的用户名必须少于 15 个字符。
          • 您的用户名只能包含字母、数字和“_”。

          来源:https://help.twitter.com/en/managing-your-account/twitter-username-rules

          【讨论】:

            猜你喜欢
            • 2012-01-28
            • 2019-05-06
            • 2011-05-24
            • 2019-04-01
            • 2011-02-15
            • 2011-07-12
            相关资源
            最近更新 更多