我必须处理很长的路,但我想忽略特定的单词:
'/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
因此在这种情况下,使用“-”字符将无用。
答案 0 :(得分:1)
在([^/]+)_\d+---.*\.jpg$
中使用以下条件:
import re
str_list = ['/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']
pat = re.compile(r'([^/]+)_\d+---.*\.jpg$')
for s in str_list:
if "light" in s:
print(re.search(pat, s).group(1))
else:
print(re.search(pat, s).group(1).rpartition('-')[2])
输出:
side
side
others
light-side
答案 1 :(得分:1)
您可以使用
(?:(?:dark|medium)-)?([^/]+)_\d+---[^/]*\.jpg$
请参见regex demo
详细信息
(?:(?:dark|medium)-)?
-一个与1个或0个重复匹配的可选组
(?:dark|medium)
-dark
或medium
个单词(如果您只想避免整个单词都匹配,请使用(?:\b(?:dark|medium)-)?
)-
-连字符([^/]+)
-第1组:/
以外的任何一个或多个字符_
-下划线\d+
-1个以上数字---
-三个连字符[^/]*
-除/
以外的0多个字符\.jpg
-.jpg
子字符串(.
是特殊字符,因此必须转义)$
-字符串的结尾。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。