Twitter用户名的正则表达式

Posted

技术标签:

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

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

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

【问题讨论】:

Twitter 用户名有哪些限制? 请参阅@rayfranco 的回答了解规格。 【参考方案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])@(\w1,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])@(\w1,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;])@(\w1,15)\b。 (Twitter 本身还是更好的——它正确地自动链接了 /@abc 中的 @-mention,以及 https://medium.com/@abc 中的完整 URL——但是哦。)【参考方案4】:

Twitter recently released 到 open 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 中添加等效的 \pL 和 '' 它们通常包含在 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/|@?)(\w1,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

【讨论】:

以上是关于Twitter用户名的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于 hive 的 twitter 数据的正则表达式

PHP 正则表达式使Twitter链接可点击

PySpark 中的正则表达式

如何使用正则表达式解析 OData 参数?

验证用户名的正则表达式

如何用正则表达式验证用户名