所以我想从路径中提取图像名称,以便在分类任务中进一步将它们用作标签。 这是意大利面:
[PosixPath('/ content / drive /我的云端硬盘/徽标/adidas10.jpg')
PosixPath('/ content / drive /我的云端硬盘/徽标/adidas11.jpg'),
PosixPath('/ content / drive /我的云端硬盘/徽标/adidas13.jpg')
。 。 。]并可以显示600张图像。
所以我想要得到的是品牌名称,例如adidas。
这是我使用的RegEx表达式:
r’([\w\s.-]).[jpg]’
但是,检查图像标签后得到的是:
print(data.classes)
['L']
有什么建议吗? , 谢谢。
答案 0 :(得分:3)
([\w\s.-])
([A-Za-z0-9_]
,空格,文字.
,文字-
中的任何一个)正在捕获L
中的Logo
,因为它遵循:
.
:任何单个字符; o
在这种情况下[jpg]
:j
,p
,g
中的任何一个; g
在这里您需要:
/([^/]+)\.jpg$
现在,唯一捕获的组将包含图像名称。
/
与文字/
匹配([^/]+)
匹配一个或多个不是/
的字符-文件名\.jpg
与.jpg
的末尾($
)匹配答案 1 :(得分:2)
Regex101是试用正则表达式的绝佳资源。
您尝试使用方括号[]
对文件结尾进行分组,方括号j
创建三个字符p
,g
或+
中任意一个的选择。该点不会转义,因此-在正则表达式语法中-是任何字符。由于您从不添加任何乘数(例如*
表示1个或更多字符,?
表示0个或更多字符,或os
表示可选字符),因此总共只匹配几个字母。
如果您想进一步了解所有正则表达式运算符,修饰符和类似概念,请I recommend reading the documentation of python's re
module。
您可以将正则表达式重写为这样的内容(提取第一组以检索文件名),也可以使用^.*\/([^\/]+\.jpg).*$
包中存在路径处理库这一事实:
from os.path import basename
a = '/content/drive/My Drive/Logo/adidas10.jpg'
filename = basename(a)
You can see this regex in action here.
由于您似乎已经拥有路径对象,因此可以提取路径的basename,在您的情况下将是文件名:
filename
adidas10.jpg
现在将是{{1}}
答案 2 :(得分:1)
您使用character class,它将使用列出的字符之一。因此,您的模式([\w\s.-]).[jpg]
将捕获到与[\w\s.-]
中的一个匹配的组中,然后匹配与由于点.
而引起的除换行符以外的任何字符,然后匹配[jpg]
中的一个。
对于您的示例数据,这将为您提供L
的捕获组和og
的匹配项,以及0
,1
,{的捕获组{1}}和匹配项3
如果您要在问题中声明的示例中获得诸如 adidas 之类的品牌名称,则可以使用一个捕获组。
.j
这将匹配
/([^/]*[^/\d])\d*\.jpg
字面上匹配/
捕获组(将包含品牌名称)
(
使用否定的character classes [^/]*
0+次不匹配/
/
不匹配[^/\d]
或数字/
关闭群组)
匹配数字0+次\d*
匹配.jpg