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
作为答案。
试试(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)
@000 以及带有下划线的屏幕名称(如@backslash17 和@fixxxer 所述)都应该被捕获。并且它不会仅仅通过简单地将 @ 替换为 # 来捕获主题标签,因为主题标签也可以包含 unicode。所以提及的表达式应该是(?<=^|(?<=[^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@/\!?=&])@(\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
、@handle
和 twitter.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用户名的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章