1

我正在尝试编写自己的降价扩展,对于视频,我希望用户能够提供宽度和高度的可选值。可用的降价格式如下:

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+|)\]|)。如果我提供宽度和高度的值,它工作正常。但是,如果我省略它或省略整个括号部分(应该没问题),我的代码仍然会返回捕获的组 for widthand heightwith values None。那不是我想要的。

我想如果 used 没有提供宽度或高度或提供空括号或根本没有提供它,那么宽度和高度的组不会评估。

UPD:也许这是 python 正则表达式的副作用 - 总是评估命名组,我不确定。

4

1 回答 1

3

使组本身是可选的,而不是它包含的内容:

...(?:\[(?P<width>\d+)?\s*,\s*(?P<height>\d+)?\])?

通常也?比空的替代方案更具可读性(并且可能更有效)。

现在,如果您省略其中一个width,那么m.group(width)将是None(对于 也是类似的height)。请注意,没有办法摆脱它None。应用正则表达式时re,它将初始化与模式中的组对应的所有值(即,模式中的所有编号组和所有命名组在 中定义.group())。参与匹配的组和不参与匹配的组之间的区别在于它们是否产生一个字符串(可能是一个空字符串)或者它们是否是None. 这就是来龙去脉。

请注意,此模式还允许[,]作为完全省略括号的同义词。

于 2013-06-28T12:38:14.093 回答