正则表达式匹配尽可能少的字符

Regular expression to match as less characters as possible

我想从 a/b/c/x.py 匹配 x.py,当我使用 re:

s = 'a/b/c/x.py'
res = re.search('/(.*.py)?', s).group(1)

>>> res = b/c/x.py

这不是我需要的。有什么想法吗?

import re
s = 'a/b/c/x.py'
res = re.search('\w*\.py', s).group() # It will match alphanumeric
# res = re.search(r'[\w&.-]+$', s).group() 
# The above regex will match alphanumeric and the given special characters

编辑

要匹配最后一个 / 之后的所有内容,您可以使用以下正则表达式

res = re.search('[^/]+$', s).group()

我更喜欢这里的拆分方法:

s = 'a/b/c/x.py'
last = s.split('/')[-1]
print(last)  # x.py

您不需要正则表达式,只需使用 str.rsplitmaxsplit=1,然后取最后一项:

>>> s.rsplit('/',1)[-1]
'x.py'

如果你需要确保元素是路径中的最后一个,你可以在前面加上(?<=\/),一个积极的后视:

>>> s = 'a/b/c/x.py'
>>> el = re.search(r"(?<=\/)(\w+\.py)", s).group(1)
>>> el
'x.py'

否则,如果你还需要匹配filename.py,你需要删除它:

>>> s2 = 'file.py'
>>> el = re.search(r"(\w+\.py)", s2).group(1)
>>> el
'file.py'

当你想从路径中提取文件名时,你应该使用os.path.split。 Python中的os.path.split()方法用于将路径名拆分为独立于OS的一对头尾。在这里,tail 是最后一个路径名组件,head 是指向它的所有内容。

import os

path = 'a/b/c/x.py'
res = os.path.split(path)
print(res[1])

您还可以使用 normpathos.sep 解决此问题:

import os

path = 'a/b/c/x.py'
path = os.path.normpath(path)
res = path.split(os.sep)
print(res[-1])

您可以像@ThePyGuy 在这种情况下所说的那样使用 rsplit,通过将行更改为:

来避免更多拆分
res = path.rsplit(os.sep,1)