在Python正则表达式中,如何忽略捕获组内的表达式?

时间:2012-06-20 02:49:20

标签: python regex

我有一个看起来像这样的字符串:

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

就我所接受的而言,我想要非常自由。要求是:

  1. <name>组件是必需的。
  2. 必须具有.jpg文件扩展名
  3. 只要最终结果是以下排列之一,您可以将组件留空或完全遗漏:
    • <name>.jpg
    • <name>-<gender>.jpg
    • <name>-<gender>-<age>.jpg
  4. 被认为有效的例子:

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

    有人有任何建议吗?

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:2)

将您的正则表达式重写为:

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

从技术上讲,您不需要在字符类-中转义[],因为它是类中的最后一个。但我会把它留在那里以保证安全。

答案 2 :(得分:0)

咦?

你的意思是r'([^ - ] )(?:(?: - )([^ - ] ))?((?: - )[^ - ] *)?. JPG')

说真的,你正在捕捉破折号,因为它在外部捕获的括号中。