使用Python正则表达式的奇怪行为 - findall只找到“()?”一部分

时间:2013-05-23 18:33:42

标签: python regex

我正在编写一个正则表达式来查找字符串中的单位和大小(或者它可以作为维度)。例如:“产品:A,2 x 3.5加仑瓶”

为简单起见,我删除了所有空格,所以这就变成了:

“产品:A,2x3.5gallonbottles”

我的正则表达式如下:

numAndSize = re.compile(r'\d+[xX]\d+(\.\d+)?')

但是当我尝试使用findall时,会发生这种情况:

In [47]: numAndSize.findall("Product:A,2x3.5gallonbottles")
Out[47]: ['.5']

我 - 只在这个字符串中得到'.5',而不是整个表达式

然而,使用搜索和分组可以按预期工作:

In [50]: numAndSize.search("Product:A,2x3.5gallonbottles").group(0)
Out[50]: '2x3.5'

从那里开始,我尝试将我的正则表达式更改为不包含可选的十进制数,然后运行findall。

In [51]: numAndSize = re.compile(r'\d+[xX]\d+')
In [52]: numAndSize.findall("Product:A,2x3.5gallonbottles")
Out[52]: ['2x3']

这种行为背后有原因吗?为了我的目的,我当然可以使用.search()。group(),但我个人喜欢findall,因为输出以干净的格式提供了更多的信息。

2 个答案:

答案 0 :(得分:2)

如果正则表达式包含任何捕获组,re.findall()将返回这些组而不是整个匹配。要获得整个匹配,请使用非捕获组:

>>> numAndSize = re.compile(r'\d+[xX]\d+(?:\.\d+)?')
>>> numAndSize.findall("Product:A,2x3.5gallonbottles")
['2x3.5']

或者,如果您可以利用此行为让它返回维度的元组(或单位或它们是什么):

>>> numAndSize = re.compile(r'(\d+)[xX](\d+(?:\.\d+)?)')
>>> numAndSize.findall("Product:A,2x3.5gallonbottles")
[('2', '3.5')]

答案 1 :(得分:1)

您正在使用()创建捕获组。 The documentation says

  

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

如果您实际上不想捕获小数部分,请使用非捕获组:

numAndSize = re.compile(r'\d+[xX]\d+(?:\.\d+)?')