基本的RegEx模式会产生不希望的结果

时间:2014-02-17 12:36:50

标签: python regex

我有这样的输入(在名为mylist的列表中):

Encontrados 2 Inmuebles.  Página 1 de 1
Encontrados 1 Inmuebles.  Página 1 de 1
Encontrados 0 Inmuebles.
Encontrados 1.931 Inmuebles.  Página 1 de 129
Encontrados 12 Inmuebles.  Página 1 de 1

我想将每行的第一次出现提取为双位数0-99。所需的输出是:

[' 2 ', ' 1 ', ' 0 ', ' 12 ']

我不希望第4行匹配,因为有两个以上的数字(西班牙语中小数点是逗号,千位分隔符是点)

我的aproach就是这种模式( \d{1,2} )mask = re.compile(' \d+ ') 然后我用[(mask.search(item)).group(0) for item in mylist]

取第一组

但我得到的输出是:

[' 2 ', ' 1 ', ' 0 ', ' 1 ', ' 12 ']

我相信这是因为Encontrados 1.931 Inmuebles. Página 1 de 129字符串中第一次出现的是'Página'字后面的'1'。但我可以自己解决这个问题。

2 个答案:

答案 0 :(得分:2)

提议的解决方案

使用否定前瞻(?!)

指定数字后面不应有小数点,如下所示:

\d{1,2}(?!\.)

然而这仍然会与Página之后的数字相匹配。所以你可能想要更具体:

( \d{1,2}(?! de |\.) )

根据示例,这否定了在比赛结束后出现的“de”一词。

在线示例:

Regex101

http://regex101.com/r/rN0uB5

答案 1 :(得分:2)

在我看来,你可以使用这样的东西:

mask = re.compile('^Encontrados (\d{1,2}) ')

然后使用.group(1)来获取数字。

regex101 demo

否则,如果你想严格获得第一个数字,可能是这样的:

mask = re.compile('^\D* (\d{1,2}) ')

regex101 demo