为什么这个正则表达式不匹配

时间:2018-09-09 10:00:41

标签: python regex

我有字符串

"<Request 'http://127.0.0.1:5000/findrisk?latitude=32.7766642&longitude=-96.79698789999998' [GET]>" 

我正在尝试获取“纬度= 32.7766642”和“经度= -96.79698789999998”

我认为这会起作用:

re.findall('(latitude|longitude)=-?\d+.\d+', req)

基本上是纬度或经度,后跟一个等号,然后是一个可选的负号,然后是一个或多个数字,然后是一个句点,然后是一个或多个数字,但这将返回

['latitude', 'longitude']

我已经尝试过在线正则表达式提取器,并且它们正在正确提取“ latitude = 32.7766642”和“ longitude = -96.79698789999998”,但python的re库不是。为什么会这样?

4 个答案:

答案 0 :(得分:0)

您仅捕获组中的标签,并尝试捕获类似这样的值:

print(re.findall('(latitude|longitude)=(-?\d+.\d+)', req))

这将返回元组列表:

[('latitude', '32.7766642'), ('longitude', '-96.79698789999998')]

完整示例:

import re
req ="<Request 'http://127.0.0.1:5000/findrisk? 
latitude=32.7766642&longitude=-96.79698789999998' [GET]>"
print(re.findall('(latitude|longitude)=(-?\d+.\d+)', req))

答案 1 :(得分:0)

'latitude=-?\d+\.\d+|longitude=-?\d+\.\d+'模式与findall一起使用会为您提供所需列表:

import re

req = "<Request 'http://127.0.0.1:5000/findrisk?latitude=32.7766642&longitude=-96.79698789999998' [GET]>"

print(re.findall('latitude=-?\d+\.\d+|longitude=-?\d+\.\d+', req))
# ['latitude=32.7766642', 'longitude=-96.79698789999998']

答案 2 :(得分:0)

使用python时,正则表达式的问题是假定此处的括号是捕获表达式,而不是按照您希望的方式分组。因此,您真正想要的是捕获完整表达式,但 group 却不捕获关键字纬度或经度。

从Python re模块文档中,

  

(?:...)正则括号的非分组版本。

这就是您想要的。因此您的代码应如下所示:

re.findall('((?:latitude|longitude)=-?\d+.\d+)', req)

请注意,我正在捕获整个内容,并按照文档中的非分组括号进行分组。在我的系统上,这给了我想要的结果:

['latitude=32.7766642', 'longitude=-96.79698789999998']

答案 3 :(得分:0)

您可以按照其他答案中所述更改正则表达式。但是您也可以使用re.finditer()re.group()来获取想要的行为:

[x.group() for x in re.finditer('(latitude|longitude)=-?\d+.\d+', req)]

然后,您可以更好地控制要分组的内容。 .group()返回子组,没有参数或参数0,这意味着只返回整个匹配项。