我正在尝试编写自己的降价扩展程序,对于视频,我希望用户能够为宽度和高度提供可选值。可用的降价格式如下:
http:/vimeo.com/456456456[width,height]
http:/vimeo.com/456456456
http:/vimeo.com/456456456[,height]
http:/vimeo.com/456456456[width,]
我对第一部分没有疑问,但只有最后一部分 - 宽度和高度。我目前的正则表达式如下:
rx = r'([^(]|^)(http|https)://(?:www.|)vimeo\.com/(?P<vimeoid>\d+)(?:\[(?P<width>\d+|),\s*,\s*(?P<height>\d+|)\]|)\S*'
实际上只有最后一部分有趣:(?:\[(?P<width>\d+|),\s*,\s*(?P<height>\d+|)\]|)
。如果我提供宽度和高度的值,它工作正常。但是如果我省略它或省略整个括号部分(应该没问题),我的代码仍会返回width
和height
的已捕获组,其值为None
。那不是我想要的。
我想如果使用了没有提供宽度或高度或提供空括号或根本没有提供它,那么宽度和高度的组不会评估。
UPD:也许是python正则表达式的副作用 - 总是评估命名组,我不确定。
答案 0 :(得分:3)
使组本身可选而不是它包含的内容:
...(?:\[(?P<width>\d+)?\s*,\s*(?P<height>\d+)?\])?
同样?
通常比空替代方案更具可读性(并且可能更有效)。
现在,如果您省略width
,则m.group(width)
将为None
(同样适用于height
)。请注意,没有办法摆脱None
。当re
应用正则表达式时,它将初始化与模式中的组对应的所有值(即,所有编号的组以及模式中的所有命名组,将为在.group()
中定义。参与比赛的组和不参加比赛的组之间的区别在于它们是否产生一个字符串(可能是空字符串)或它们是否为None
。就是这样。
请注意,此模式还允许[,]
作为完全省略括号的同义词。