在匹配模式的字符串中查找文本

时间:2014-02-04 12:46:03

标签: python regex

我有一个text / csv文件,其中包含如下所示的行:

05:21:20PM   Driving 46 84.0         Some Road; Some Ext 1; in SomePLace; Long 38 12 40.6 E Lat 29 2 47.2 S

还有其他行包含我不追求的数据。

我只想提取时间戳,然后提取LatLong。

我感兴趣的行中唯​​一不变的是开头的timstamp,总是8个字符长,以PM或AM结束,然后以“Long”开头的Lat / Long结束在“S”中。

有没有办法可以运行这个文件,只删除这两个文本,将它们连接成一个新行,并忽略所有其他没有时间戳的行作为第一个条目和Lat / Long部分结尾(某些行的开头有时间戳但不是纬度/长度)

3 个答案:

答案 0 :(得分:1)

使用csv模块解析行,然后拆分;上的最后一列以获取纬度/经度坐标:

with open(inputfilename, 'rb') as inputfh:
    reader = csv.reader(inputfh, delimiter='\t')
    for row in reader:
        timestamp = row[0]
        lat_long = row[2].rpartition(';')[-1].strip()

这假定文件是以制表符分隔的,并且latitute / longitude条目始终是第3列中的最后;分号分隔值

答案 1 :(得分:1)

如果您的数据是 CSV 格式,我建议您不要使用正则表达式,因为这不是很漂亮,正则表达式是 CSV 的错误工具。但由于您的数据看起来不像真正的 CSV 格式,因此使用正则表达式解析它可能是一个选项,此代码对您提供的示例起作用

import re

with open('inputfilename', 'rU') as f:
    for line in f:
        mat = re.match("(\d+):(\d+):(\d+)([AP]M).*Long\s+([^EW]+[EW]).*Lat\s+([^NS]+[NS])", line)
        if mat is not None:
            print mat.groups()

结果:

('05', '21', '20', 'PM', '38 12 40.6 E', '29 2 47.2 S')

此结果的进一步处理留作练习,但它可能如下所示:

hour, minute, second, am_pm, long, lat = mat.groups()

答案 2 :(得分:0)

>>> s = "05:21:20PM   Driving 46 84.0         Some Road; Some Ext 1; in SomePLace; Long 38 12 40.6 E Lat 29 2 47.2 S"
>>> date = s.split(" ")[0]
>>> date
'05:21:20PM'
>>> long_start = "Long"
>>> lat_start = "Lat"
>>> longtitude = s[s.find(long_start) + len(long_start): s.find(lat_start)]
>>> longtitude 
' 38 12 40.6 E '
>>> latitude = s[s.find(lat_start) + len(lat_start):]
>>> 
>>> latitude
' 29 2 47.2 S'
>>> latitude = s[s.find(lat_start) + len(lat_start):].strip()
>>> latitude
'29 2 47.2 S'
>>>