繁体   English   中英

如何使用正则表达式进行匹配和提取 - Python

[英]How to match and extract using regex - Python

我正在研究如何使用正则表达式并试图弄清楚如何提取纬度和经度,无论数字是正数还是负数,就在“?ll =”之后,如下所示:

https://maps.google.com/maps?ll= -6.148222,106.8462 &q=loc:-6.148222,106.8462&

我在 python 中使用了以下代码来仅获取上面标记的第一个数字:

for link in soup.find_all('a', {'class': 'popup-gmaps'}):
    lnk = str(link.get('href'))
    print(lnk)
    m = re.match('-?\d+(?!.*ll=)(?!&q=loc)*', lnk)
    print(m)
    #lat, *long = m.split(',')
    #print(lat)
    #print(long)

我得到的结果不是我所期望的:

https://maps.google.com/maps?ll=-6.148222,106.8462&q=loc:-6.148222,106.8462&
None

我得到的是“无”而不是值“-6.148222,106.8462”。 我还尝试将这些数字分成两个变量,称为 lat 和 long,但由于我总是得到“无”,python 停止处理“退出代码 1”,直到我评论行。

干杯,

我会使用适当的 URL 解析器,在这里使用正则表达式会询问问题,以防嵌入在您正在抓取的页面中的 URL 正在以一种会破坏您使用的正则表达式的方式发生变化。

from urllib.parse import urlparse, parse_qs

url = 'https://maps.google.com/maps?ll=-6.148222,106.8462&q=loc:-6.148222,106.8462&'
scheme, netloc, path, params, query, fragment = urlparse(url)
# or just
# query = urlparse(url).query
parsed_query_string = parse_qs(query)
print(parsed_query_string)
lat, long = parsed_query_string['ll'][0].split(',')
print(lat)
print(long)

输出

{'ll': ['-6.148222,106.8462'], 'q': ['loc:-6.148222,106.8462']}
-6.148222
106.8462

您应该使用re.search()而不是re.match()因为re.match()用于精确匹配。

这可以解决问题

for link in soup.find_all('a', {'class': 'popup-gmaps'}):
    lnk = str(link.get('href'))
    m = re.search(r"(-?\d*\.\d*),(-?\d*\.\d*)", lnk)
    print(m.group())
    print("lat = "+m.group(1))
    print("lng = "+m.group(2))

使用 diff 正则表达式获取纬度和经度

import re
str1="https://maps.google.com/maps?ll=6.148222,-106.8462&q=loc:-6.148222,106.8462&"
lat=re.search(r"(-)*\d+(.)\d+",str1).group()

lon=re.search(r",(-)*\d+(.)\d+",str1).group()
print(lat)
print(lon[1:])

output

6.148222
-106.8462

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM