忽略路径字符串中的特定单词

时间:2019-02-06 13:21:48

标签: python regex

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

'/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

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

2 个答案:

答案 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)-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