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 回答