我必须处理很长的路,但我想忽略特定的单词:
'/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)
-dark
或medium
单词(如果您只想避免将它们匹配为整个单词,请使用(?:\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/