0

次のような文字列があります。

<name>-<gender>-<age>.jpg

私は自分が受け入れる限り、非常にリベラルになりたいと思っています。要件は次のとおりです。

  1. <name>コンポーネントが必要です。
  2. .jpgファイル拡張子が必要です
  3. 最終結果が次の順列のいずれかである限り、コンポーネントを空白のままにすることも、完全に除外することもできます。
    • <name>.jpg
    • <name>-<gender>.jpg
    • <name>-<gender>-<age>.jpg

有効と見なされるものの例:

Beamin-M.jpg
Jean.jpg
Maria-F-23.jpg

正規表現を使用して文字列の各コンポーネントを分解したいのですが、ダッシュ()をキャプチャしたくありません-。キャプチャしていないグループを使用しようとしましたが、探していた結果を得ることができませんでした。

>>> import re
>>> r = re.compile(r'([^\-]*)((?:\-)[^\-]*)?((?:\-)[^\-]*)?\.jpg')
>>> for d in (
...  'Beamin-M.jpg',
...  'Jean.jpg',
...  'Maria-F-23.jpg',
... ):
...  print r.match(d).groups()
...
('Beamin', '-M', None)
('Jean', None, None)
('Maria', '-F', '-23')

誰か提案はありますか?

4

3 に答える 3

6

よりロジックに適したソリューションがすぐに利用できる場合、私は正規表現の大ファンではないので、次のようなものを試してみます。

from os.path import splitext    

test = '<name>-<gender>-<age>.jpg'

fname, ext = splitext(test) # works with names like 'xxx.yyy.jpg'
if ext in ('.jpg', '.jpeg'):
    name, gender, age = (fname.split('-') + [None, None])[:3]
于 2012-06-20T03:03:06.730 に答える
2

正規表現を次のように書き換えます。

r'([^\-]*)(?:-([^\-]*))?(?:-([^\-]*))?\.jpg'

-技術的には、文字クラス[]はクラスの最後であるため、エスケープする必要はありません。でも安全のために置いておきます。

于 2012-06-20T02:53:12.967 に答える
0

は?

r'([^-] )(?:(?:-)([^-] ))?((?:-)[^-]*)?.jpg')

真剣に、ダッシュをキャプチャしているのは、外側のキャプチャされた括弧内にあるためです。

于 2012-06-20T02:54:10.733 に答える