2011-02-03 174 views
3

'{m}'和'{m,n}'之间的区别是什么?'在http://docs.python.org/library/re.html它说'{m,n}?'匹配范围在m到n倍的数字,但它不是一个贪婪的搜索。因此,如果它不是一个贪婪的搜索,不管它是什么,它只能匹配m?python正则表达式

+0

我不确定Python风格的正则表达式,但大多数正则表达式(以及大多数编程语言)都有一些功能相同的构造。这不是一个,但如果你找到它们,你不应该感到惊讶。 – 2011-02-03 07:20:20

+0

@chris:如果有疑问,可以使用在线工具比较几种语言的正则表达式系统:PHP和javascript获得http://regex.larsolavtorvik.com/,而python获得http://ksamuel.pythonanywhere.com。在这里你可以很容易地看到它不是一个新的构造。 – 2012-01-28 15:01:36

回答

14

{m,n}?将优选地仅匹配m重复,但是如果长时间匹配需要,它将根据需要扩展至n重复。

比较^x{2}y$^x{2,4}?y$

前者将失败xxxy而后者将匹配。

总结:

x{m}:比赛x正是m倍。

x{m,n}:尝试匹配xn倍,但如果导致整体匹配失败,还给根据需要,但比赛至少m倍(贪婪量词)。

x{m,n}?:尝试匹配xm倍,但如果导致整体匹配失败,根据需要展开,但比赛顶多n倍(懒惰量词)。

1

这是最容易看到使用两个匹配的组的例子:

>>> re.match(r'(x{1,3}?)(.*)', 'xxxxx').groups() 
('x', 'xxxx') 
>>> re.match(r'(x{1,3})(.*)', 'xxxxx').groups() 
('xxx', 'xx') 

换句话说,{N,M}和{N,M}?都能匹配完全相同的东西;当不止一种方法匹配时,它发生的变化就是分组发生的地方。