python正则表达式匹配#ner

时间:2014-10-08 15:05:09

标签: python regex

我试图在这样的文件中使用正则表达式提取位置:

 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)

列表,元组或可迭代的

2 个答案:

答案 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, ...