我试图在这样的文件中使用正则表达式提取位置:
36 17.89 N, 2 51.62 W
35 51.13 N, 2 51.62 W
35 51.13 N, 2 49.14 W
36 17.89 N, 2 49.14 W
36 17.89 N, 2 46.66 W
35 51.13 N, 2 46.66 W
35 51.13 N, 2 44.18 W
36 17.89 N, 2 44.18 W
36 17.89 N, 2 41.7 W
35 51.13 N, 2 41.7 W
35 51.13 N, 2 39.22 W
36 17.89 N, 2 39.22 W
36 17.89 N, 2 36.74 W
35 51.13 N, 2 36.74 W
35 51.13 N, 2 34.26 W
36 17.89 N, 2 34.26 W
这是一个.txt文件。
提取数据的正则表达式是:
pattern = r'((?m)^\t\s([1-9]?[0-9])\s([0-9]?[0-9]\.?[0-9]{0,2}))\s([NS]),\s{0,2}([1-9]?[0-9])\s([0-9]?[0-9]\.?[0-9]{0,2}).([WE])'
我可以提取组来处理字符串浮动,但我想知道如何在列表中存储匹配号码作为“ID'每行
例如(3, 35.8521,-2.685666)
列表,元组或可迭代的
答案 0 :(得分:0)
我会使用split而不是regex:
with open('coordinates.txt','r') as file:
for line in file:
coord = [pair.split() for pair in line.split(',')]
答案 1 :(得分:0)
使用enumerate获取每一行的索引,如下所示:
import re
pattern = re.compile(
r'(?m)^\s*([0-9]+)\s*([0-9.]+)\s*([NS]),\s*([[0-9]+)\s*([0-9.]+)\s*([WE])')
with open('in.txt') as f:
result = [
(i, lat, lng) for i, (lat, lng) in enumerate(
((int(lat) + float(latf) / 60) * (1 if latdir == 'N' else -1),
(int(lng) + float(lngf) / 60) * (1 if lngdir == 'E' else -1))
for lat, latf, latdir, lng, lngf, lngdir
in pattern.findall(f.read()))]
from pprint import pprint
pprint(result)
或者,如果您更喜欢自己声明中的每一步:
with open('in.txt') as f:
# Get the characters from the file
data = f.read()
# Find the formatted fields
data = pattern.findall(data)
# Convert the string fields into numeric values
data = (((int(lat) + float(latf) / 60) * (1 if latdir == 'N' else -1),
(int(lng) + float(lngf) / 60) * (1 if lngdir == 'E' else -1))
for lat, latf, latdir, lng, lngf, lngdir in data)
# Add an index
data = enumerate(data)
# Flatten the tuple
data = ((i, lat, lng) for i, (lat, lng) in data)
# And there you are
result = list(data)
在任何一种情况下,如果您想要基于1的索引,请使用(i+1, lat, lng) for i, ...
。