我正在编写一个名为
get_coords(item(,它将数据文件中位置 1 列的预期格式的单个字符串作为输入。该函数应返回一个包含两个条目的列表:纬度和经度作为浮点值。如果缺少纬度和经度,则应返回 numpy.nan (NaN( 以指示缺少的值。
成功实现的示例是:
text = '1533 Bridle Creek BlvdnVirginia Beach, VA 23464-7907n(36.787392, -76.15761)'
print(get_coords(text))
[36.787392, -76.15761]
我觉得我需要使用某种形式的字符串拆分,但是,经度和纬度坐标可以有不同的长度,这让我觉得我需要使用 re 模块之类的东西并使用类似 re.search 的东西; 如何提取坐标并将它们作为列表返回,给定不同长度的坐标以及初始字符串?
看起来坐标总是在最后一行。如果是这种情况,我们可以执行以下操作:
coords_str = text.splitlines()[-1]
获取最后一行。
由于一个幸运的巧合,坐标的格式似乎与python元组完全相同。 正因为如此,我们可以使用 ast
模块将其转换为 Python 元组:
import ast
ast.literal_eval(coords_str)
如果要使用 re
,这里有一个模式:
return list(map(float, re.search(r'(([+-]?[d.]+),s*([+-]?[d.]+))', text).groups()))
简而言之,re.search
以下模式
- 以 open paren 开头 ->
(
- 有一个可选符号 ->
[+-]?
- 有一系列数字和句点 ->
[d.]+
- 有一个逗号和可选的空格 ->
,s*
- 重复数字模式 ->
[+-]?[d.]+
- 并以接近的
)
结束
请注意,额外的括号创建匹配的组,稍后可由.groups()
调用查询。
你可以使用这样的东西:
def get_coords(str):
latLong = str.split('n')[-1]
if not latLong:
return numpy.nan
latLong = latLong.replace("(","")
latLong = latLong.replace(")","")
latLongList = latLong.split(',')
latLongList = list(map(float, latLongList))
return latLongList
您可能会:
- 将字符串拆分为"">;
- 获取带有纬度和经度的最后一行;
- 如果缺少值,则返回 numpy.nan;
- 去掉像"("和"(">这样的字符;
- 将结果拆分为",">;
- 设置值的格式。
无需担心琴弦上的不同长度。