我必须处理很长的路,但我想忽略特定的单词:

'/home/me/data/dataset/images/dark-side_23---83971436re.jpg'
'/home/me/data/dataset/images/medium-side_23---83971436re.jpg'
'/home/me/data/dataset/images/others_23---83971436re.jpg'


因此输出应为:

side
side
others


我正在使用此正则表达式:

pat = re.compile(r'/([^/]+)_\d+---.*.jpg$')
re.search(pat, path_string).groups()


而且我尝试了使用否定查找的方法,但是不起作用:

pat = re.compile(r'/(?!dark|medium)([^/]+)_\d+---.*.jpg$')


有任何想法吗?

编辑:对不起,我忘了提到它们可能存在另一个字符串,例如:

'/home/me/data/dataset/images/light-side_23---83971436re.jpg'


它应该返回的位置:

light-side


因此,在这种情况下,使用“-”字符将无用。

最佳答案

您可以使用

(?:(?:dark|medium)-)?([^/]+)_\d+---[^/]*\.jpg$


请参见regex demo

细节


(?:(?:dark|medium)-)?-匹配1个或0个重复的可选组


(?:dark|medium)-darkmedium单词(如果您只想避免将它们匹配为整个单词,请使用(?:\b(?:dark|medium)-)?
--连字符

([^/]+)-组1:/以外的任何一个或多个字符
_-下划线
\d+-1个以上的数字
----三个连字符
[^/]*-除/以外的0多个字符
\.jpg-.jpg子字符串(.是特殊字符,因此必须转义)
$-字符串结尾。


Python demo

import re
strs = ['/home/me/data/dataset/images/dark-side_23----83971436re.jpg',
            '/home/me/data/dataset/images/medium-side_23---83971436re.jpg',
            '/home/me/data/dataset/images/others_23---83971436re.jpg',
            '/home/me/data/dataset/images/light-side_23---83971436re.jpg']
rx = re.compile(r'(?:(?:dark|medium)-)?([^/]+)_\d+---[^/]*\.jpg$')
for s in strs:
    m = rx.search(s)
    if m:
        print(m.group(1))


输出:

side
side
others
light-side


请注意,如果您首先使用os.path.basename(os.path.normpath(s))抓住最后一个子部分,则可以稍微简化一下。然后,您可以使用r'^(?:(?:dark|medium)-)?(.+)_\d+---.*\.jpg$'。请参见this Python demo

关于python - 忽略路径字符串中的特定单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54554679/

10-12 21:53
查看更多