Twitter用户名的正则表达式

50

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

如果提供一个Python示例将会得到额外的奖励。


8
Twitter用户名有哪些限制? - David Kanarek
请参考@rayfranco的答案。 - scharfmn
11个回答

80
(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9-_]+)

我使用这个方法是因为它忽略了电子邮件。

这里有一个示例推文:

@你好,@你怎么样,@我的朋友,发邮件给我@ whats.up@example.com @shahmirj

匹配项:

  • @你好
  • @你
  • @我的朋友
  • @shahmirj

同样的表达式也适用于hashtags,只需要将表达式中的@替换为#即可。


9
非常好!只需要一个更正:hastags和screenNames都可以包含下划线。我会将其添加进去,以便得到以下结果的正则表达式: (?<=^|(?<=[^a-zA-Z0-9-.]))#([A-Za-z]+[A-Za-z0-9-]+) - backslash17
11
另外,下划线也可以出现在用户名的开头: (?<=^|(?<=[^a-zA-Z0-9-.]))#([A-Za-z_]+[A-Za-z0-9_]+) - NZal
1
将答案应用于“'RT @daddy_san: RIGHT IN THE FEELS BRUH”只会得到“@daddy”作为答案。 - fixxxer
2
尝试 (?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+) - Angel.King.47
1
@000 应该被捕获,同时带下划线的屏幕名称也应该被捕获(如 @backslash17 和 @fixxxer 所述)。但是它不会通过简单地用 # 替换 @ 来捕获标签,因为标签也可以包含 Unicode。因此提到的表达式应为 (?<=^|(?<=[^a-zA-Z0-9-\.]))@([A-Za-z0-9_]+) - rokh
显示剩余3条评论

21

如果你正在谈论 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)

有没有官方规范? - Juanjo Conti
不,但我知道Twitter用户名可以包含字母数字和下划线,如果允许其他字符,那么在实际使用中并不常见。 - icktoofay
1
我爱你,但那不正确。好吧它是正确的,但它也会捕捉电子邮件地址,而 Twitter 不会这样做。 - Angel.King.47
2
从Angel.King.47下面使用正则表达式(?<=^|(?<=[^a-zA-Z0-9-\.]))@([A-Za-z]+[A-Za-z0-9]+)捕获电子邮件地址。 - supercobra

19

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

/(^|[^@\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规范

你的用户名不能超过15个字符。你的真实姓名可以更长(20个字符),但为了方便起见,用户名应该保持较短。 用户名只能包含字母数字字符(A-Z字母,0-9数字),下划线是唯一例外。请检查您所需的用户名是否不包含任何符号、破折号或空格。


2
最干净的。规格的发布很好。 - scharfmn
2
谢谢,这很棒!但是它在 medium 的 URL 中错误地匹配了用户名,例如 https://medium.com/@p5d12000/xyz。这是一个修改后的版本,可以修复这个问题:`(^|[^\w@/\!?=&])@(\w{1,15})\b`。(Twitter 本身仍然更好 - 它可以正确自动链接 /@abc 中的 @-mention 和 https://medium.com/@abc 中的完整 URL - 但是没关系。) - ryan

13

Twitter最近发布了包括Java、Ruby(gem)和Javascript实现的用于查找用户名、哈希标签、列表和URL的代码,已开源。

它非常基于正则表达式。


2
表单中只接受 A-Z、0-9 和下划线这几个字符。虽然用户名不区分大小写,但你可以使用 r'@(?i)[a-z0-9_]+' 来正确匹配所有内容,并区分用户。请注意保留 HTML 标签。

1
它们不区分大小写并没有太大的影响。(?i) 是指你的模式,而不是你捕获的值。程序仍然需要处理 ABC 和 Abc 作为相同的值。 - Kobi

2

这是我在一个项目中使用的方法,它获取推文对象的文本属性,并将文本与标签和用户提及链接到它们在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。希望这对您有所帮助。


忘了提醒,这个程序只会捕捉@提及和#标签,不包括电子邮件。 - Chris Clouten

1

这个正则表达式看起来可以解决Twitter用户名:

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

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

1

更短的,/@([\w]+)/就可以了。


你缺少了在那个位置上带有''和重音符号的字符。在Python中添加与\p{L}相当的内容和''。 - Gubatron
它们通常包含在 Twitter 用户名中吗?我认为他不需要关注它们。当然,这样做会增加灵活性,我想。 - casraf

1

0
你可以使用以下正则表达式:^@[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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接