我有一个看起来像这样的字符串:
<name>-<gender>-<age>.jpg
就我所接受的而言,我想要非常自由。要求是:
<name>
组件是必需的。.jpg
文件扩展名<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')
有人有任何建议吗?
答案 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')
说真的,你正在捕捉破折号,因为它在外部捕获的括号中。