[英]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.