【发布时间】:2011-01-19 06:20:31
【问题描述】:
您能否提供一个匹配 Twitter 用户名的正则表达式?
如果提供 Python 示例,将获得额外奖励。
【问题讨论】:
-
Twitter 用户名有哪些限制?
-
请参阅@rayfranco 的回答了解规格。
您能否提供一个匹配 Twitter 用户名的正则表达式?
如果提供 Python 示例,将获得额外奖励。
【问题讨论】:
(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9-_]+)
我使用它是因为它忽略了电子邮件。
这是一个示例推文:
@你好@你好吗@my_friend,给我发电子邮件@000 @whats.up@example.com @shahmirj
匹配:
它也适用于主题标签,我使用相同的表达式,将 @ 更改为 #。
【讨论】:
'RT @daddy_san: RIGHT IN THE FEELS BRUH 只会得到@daddy 作为答案。
(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)
(?<=^|(?<=[^a-zA-Z0-9-\.]))@([A-Za-z0-9_]+)
如果你在谈论他们在 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)
【讨论】:
我使用的正则表达式已经在多个上下文中进行了测试:
/(^|[^@\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
您的用户名不能超过 15 个字符。您的真实姓名可以更长(20 个字符),但为方便起见,用户名会保持较短。 如上所述,用户名只能包含字母数字字符(字母 A-Z,数字 0-9),下划线除外。检查以确保您想要的用户名不包含任何符号、破折号或空格。
【讨论】:
(^|[^\w@/\!?=&])@(\w{1,15})\b。 (Twitter 本身还是更好的——它正确地自动链接了 /@abc 中的 @-mention,以及 https://medium.com/@abc 中的完整 URL——但是哦。)
Twitter recently released 到 open source 使用各种语言,包括 Java、Ruby (gem) 和用于查找用户名、哈希标签、列表和 URL 的代码的 Javascript 实现。
它非常面向正则表达式。
【讨论】:
表单中接受的唯一字符是 A-Z、0-9 和下划线。 用户名不区分大小写,因此您可以使用r'@(?i)[a-z0-9_]+' 正确匹配所有内容并区分用户。
【讨论】:
(?i) 指的是您的模式,而不是您捕获的值。将 ABC 和 Abc 处理为相同的值仍然取决于程序。
这是我在一个项目中使用的一种方法,它采用推文对象的文本属性并返回带有主题标签和 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。希望这会有所帮助。
【讨论】:
更短,/@([\w]+)/ 工作正常。
【讨论】:
这个正则表达式似乎可以解决 Twitter 用户名:
^@[A-Za-z0-9_]{1,15}$
最多 15 个字符,允许在 @ 之后直接使用下划线(Twitter 这样做),并允许所有下划线(在快速搜索后,我发现 Twitter 显然也这样做)。不包括电子邮件地址。
【讨论】:
如果您需要匹配所有 handle、@handle 和 twitter.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
【讨论】:
您可以使用以下正则表达式:^@[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')
【讨论】:
我已使用现有答案并针对我的用例进行了修改。 (用户名必须超过 4 个字符)
^[A-z0-9_]{5,15}$
规则:
来源:https://help.twitter.com/en/managing-your-account/twitter-username-rules
【讨论】: