簡體   English   中英

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

[英]Finding text in a string matching patterns

我有一個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部分在結束(某些行的開頭有時間戳但不是緯度/長度)

使用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列中的分號分隔值

如果您的數據是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()
>>> 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'
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM