如何将前瞻和 $ 与正则表达式一起使用
How to use lookahead and $ with Regex
我正在尝试获取资源的名称,我将与您分享 regexr url
我的实际正则表达式:([^/]+)(?=\..*)
我的例子:https://res-3.cloudinary.com/ngxcoder/image/upload/f_auto,q_auto/v1/blog-images/5oonz9.jpg
我正在尝试 5oonz9
我试过包括 $,但我不知道为什么它不起作用
您可以使用:
^.+\/(.+)\..+$
^.+
- 从头开始,匹配尽可能多的字符
\/
- 匹配文字 /
.
(.+)
- 匹配一个或多个字符并将其捕获为一组
\.
- 匹配文字 .
.+$
- 匹配字符串末尾的一个或多个字符(扩展名)
现场演示 here。
方法有很多种:
下面的一对使用 python:
#使用正则表达式:
>>> file_name='https://res-3.cloudinary.com/ngxcoder/image/upload/f_auto,q_auto/v1/blog-images/5oonz9.jpg'
>>> regexpr = r".*/([^\/]+).jpg$"
>>> re.match(regexpr, file_name).group(1)
'5oonz9'
>>>
#获取任意文件名:
>>> regexpr = r".*/([^\/]+)$"
>>> re.match(regexpr, file_name).group(1)
'5oonz9.jpg'
#如果有兴趣,这里有一个使用 split & take last
>>> (file_name.split("/")[-1]).split(".")[0]
'5oonz9'
>>>
您不需要捕获组,只需要匹配:
(?<=\/)[^\/.]+(?=\.[^\/.]+$)
我们可以在free-spacing模式下编写表达式使其自记录:
(?<= # begin a negative lookbehind
\/ # match '/'
) # end negative lookbehind
[^\]+ # match one or more characters other than '/'
(?= # begin a positive lookahead
\. # match '.'
[^\/]+ # match one or more characters other than '/'
$ # match end of string
) # end the positive lookahead
但是,您不应为此使用正则表达式,因为 Python 提供 os.path
:
import os
str = 'https://res-3.cloudinary.com/ngxcoder/image/'\
'upload/f_auto,q_auto/v1/blog-images/5oonz9.jpg'
base = os.path.basename(str)
print(os.path.splitext(base)[0])
#=> "5oonz9"
这里base #=> "5oonz9.jpg"
.
感谢其他答案,我找到了更直接的解决方案:
([^\/]+)(?=\.[^\/.]+$)
解释:
([^\/]+)
不匹配 1 个或多个 '/'
(?=\.)
向前看 '.'
[^\/.]+
不匹配 1 个或多个“/”和“.” (这是关键!!)
$
字符串结尾
我正在尝试获取资源的名称,我将与您分享 regexr url
我的实际正则表达式:([^/]+)(?=\..*)
我的例子:https://res-3.cloudinary.com/ngxcoder/image/upload/f_auto,q_auto/v1/blog-images/5oonz9.jpg
我正在尝试 5oonz9
我试过包括 $,但我不知道为什么它不起作用
您可以使用:
^.+\/(.+)\..+$
^.+
- 从头开始,匹配尽可能多的字符\/
- 匹配文字/
.(.+)
- 匹配一个或多个字符并将其捕获为一组\.
- 匹配文字.
.+$
- 匹配字符串末尾的一个或多个字符(扩展名)
现场演示 here。
方法有很多种:
下面的一对使用 python:
#使用正则表达式:
>>> file_name='https://res-3.cloudinary.com/ngxcoder/image/upload/f_auto,q_auto/v1/blog-images/5oonz9.jpg'
>>> regexpr = r".*/([^\/]+).jpg$"
>>> re.match(regexpr, file_name).group(1)
'5oonz9'
>>>
#获取任意文件名:
>>> regexpr = r".*/([^\/]+)$"
>>> re.match(regexpr, file_name).group(1)
'5oonz9.jpg'
#如果有兴趣,这里有一个使用 split & take last
>>> (file_name.split("/")[-1]).split(".")[0]
'5oonz9'
>>>
您不需要捕获组,只需要匹配:
(?<=\/)[^\/.]+(?=\.[^\/.]+$)
我们可以在free-spacing模式下编写表达式使其自记录:
(?<= # begin a negative lookbehind
\/ # match '/'
) # end negative lookbehind
[^\]+ # match one or more characters other than '/'
(?= # begin a positive lookahead
\. # match '.'
[^\/]+ # match one or more characters other than '/'
$ # match end of string
) # end the positive lookahead
但是,您不应为此使用正则表达式,因为 Python 提供 os.path
:
import os
str = 'https://res-3.cloudinary.com/ngxcoder/image/'\
'upload/f_auto,q_auto/v1/blog-images/5oonz9.jpg'
base = os.path.basename(str)
print(os.path.splitext(base)[0])
#=> "5oonz9"
这里base #=> "5oonz9.jpg"
.
感谢其他答案,我找到了更直接的解决方案:
([^\/]+)(?=\.[^\/.]+$)
解释:
([^\/]+)
不匹配 1 个或多个 '/'
(?=\.)
向前看 '.'
[^\/.]+
不匹配 1 个或多个“/”和“.” (这是关键!!)
$
字符串结尾