在 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 个单词字符
(?:[?/,].*)?
可选择匹配 ?
或 /
或 ,
以及行的其余部分
$
字符串结束
例如
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
我想为 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 个单词字符(?:[?/,].*)?
可选择匹配?
或/
或,
以及行的其余部分$
字符串结束
例如
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