在 python 中提取推特句柄的正则表达式

Regular expression to extract twitter handle in python

我想为 Twitter url 提取 Twitter 句柄

1.)https://www.twitter.com/sachin 2.)https://www.twitter.com/@sachin 3.)https://www.twitter.com/@sachin 4.)https://www.twitter.com/sachin?lang=en

输出 萨钦

我正在使用这个正则表达式

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

url 类型 1、2、3 给出了预期的结果,但是 url 类型 4 没有给出结果并给出了这个错误

AttributeError: 'NoneType' object has no attribute 'group'

您可以使用

r'/@?(\w+)[^/]*$'

参见regex demo

详情:

  • / - 一个 / 字符
  • @? - 一个可选的 @ 字符
  • (\w+) - 第 1 组:任何一个或多个字母、数字或 _ 个字符
  • [^/]* - /
  • 以外的零个或多个字符
  • $ - 字符串结尾。

re.search 的示例用法:

match = re.search(r'/@?(\w+)[^/]*$', twitter_url)
if match:                   # Check if there is a match
    print(match.group(1))
else:
    print("No match")       # Action upon no match

模式与第 4 个示例不匹配,因为 (\w{1,15}) 将匹配 sachin,下一个字符是 ?,模式尝试匹配 /

您可以选择匹配 ? 和该行的其余部分,或者使用字符 class [?/,]

指定所有允许的字符
^.*?\btwitter\.com/@?(\w{1,15})(?:[?/,].*)?$

模式匹配:

  • ^ 字符串开头
  • .*? 尽可能匹配除换行符以外的任何字符(如果不能有空格,则使用 \S*?
  • \btwitter\.com/@?匹配twitter.com/和可选的@
  • (\w{1,15}) 在第 1 组中捕获 1-15 个单词字符
  • (?:[?/,].*)? 可选择匹配 ?/, 以及行的其余部分
  • $ 字符串结束

Regex demo | Python demo

例如

import re
twitter_urls = [
    "https://www.twitter.com/sachin",
    "https://www.twitter.com/@sachin",
    "https://www.twitter.com/@sachin",
    "https://www.twitter.com/sachin?lang=en"
]

for twitter_url in twitter_urls:
    match = re.search(r'^.*?\btwitter\.com/@?(\w{1,15})(?:[?/,].*)?$',twitter_url)
    if match:
        print(match.group(1))

输出

sachin
sachin
sachin
sachin

为什么不使用 urllib.parse

urls = ['https://www.twitter.com/sachin', 'https://www.twitter.com/@sachin',
        'https://www.twitter.com/@sachin', 'https://www.twitter.com/sachin?lang=en']

from urllib.parse import urlparse # or urlsplit

for url in urls:
    print(urlparse(url).path.lstrip('/@'))

输出

sachin
sachin
sachin
sachin