問題

長いパスを処理する必要があり、特定の単語を無視したい:

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

正規表現デモを参照してください

詳細

  • (?:(?:dark|medium)-)? - 1 または 0 に一致するオプションのグループ または または (?:dark|medium) - darkまたはmedium単語(単語全体で一致することを避けたい場合は、(?:(?:dark|medium)-)?) - - ハイフン または
  • ([^/]+) - グループ1:/以外の文字
  • _ - アンダースコア
  • \d+ - 1 +数字
  • --- - 3つのハイフェン
  • [^/]* - /以外の文字
  • \.jpg - .jpg部分文字列(.は特別なので、エスケープする必要があります)
  • $ - 文字列の末尾。

Pythonデモ:

 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$'を使用することができます。 このPythonデモを参照してください。

  同じタグがついた質問を見る

pythonregex