簡體   English   中英

使用正則表達式從文本文件中提取值

[英]Using regex for extracting values from a text file

我有一個文本文件,每當遇到字符串時,我想從中提取與字符串特定距離的值。 我對此完全陌生,並且知道這些類型的模式匹配問題可以使用正則表達式來解決。

<BEGIN> AUTO,CHANSTATE
<CH> Time: 2002-07-04 
<CH> Chan   Doppler       Code     Track        CdDoppler       CodeRange
<CH>    0   1449.32  2914.6679      0.00        833359.36        -154.093
<CH>    1   1450.35  2414.8292      0.00        833951.94        -154.093
<CH>    2   1450.35  6387.2597      0.00        833951.94        -154.093
<END>
<BEGIN> AUTO,CHSTAT
(it goes on)---------------------

上述結構在文件內重復多次。 有什么方法可以導出多普勒值(1449.32、1450.35、1450.35)並將其存儲在 python 列表中? 既然這一切都以“AUTO,CHANSTATE”開頭,有沒有辦法可以將其作為獲取值的參考? 或任何其他可能我無法想到的方式。 任何幫助都會非常顯着。

更好的方法是逐行解析文件。 在空白處拆分行並使用列表索引2捕獲Doppler的值。 這種方法的優點是,如果將來需要,您也可以訪問其他參數值。 嘗試這個:

with open("sample.txt") as file: # Use file to refer to the file object

    for line in file:  # Parsing file line by line
        data = line.split()  # Split the line over whitespace
        try:
            if isinstance(float(data[2]), float):
                print("Doppler = ", data[2])
        except (IndexError, ValueError) as e:
            pass

輸出:

Doppler =  1449.32
Doppler =  1450.35
Doppler =  1450.35

檢查此演示: https ://www.online-python.com/mgE32OXJW8

如果您真的想要/需要使用正則表達式,您可以這樣做。

代碼:

import re

text = '''<BEGIN> AUTO,CHANSTATE
<CH> Time: 2002-07-04 
<CH> Chan   Doppler       Code     Track        CdDoppler       CodeRange
<CH>    0   1449.32  2914.6679      0.00        833359.36        -154.093
<CH>    1   1450.35  2414.8292      0.00        833951.94        -154.093
<CH>    2   1450.35  6387.2597      0.00        833951.94        -154.093
<END>
<BEGIN> AUTO,CHSTAT
(it goes on)---------------------'''

find_this = re.findall('<CH>.*?[0-9].*?\s.*?([0-9].*?)\s', text)

print(find_this)
['1449.32', '1450.35', '1450.35']

[Program finished]

然而,正如其他人指出的那樣,還有其他方法可以在沒有 re 的情況下做到這一點。

或者任何其他方式...

沒有正則表達式,只有字符串函數

  • 遍歷文件中的行
  • 檢查行(以、包含或等於) '<BEGIN> AUTO,CHANSTATE'
    • 當它出現時,跳過接下來的兩行
  • 繼續迭代,對於以'<CH>'開頭的每一行,
    • 在空白處拆分行,保存結果的第三項( result[2]
  • 繼續直到一行(開頭、包含或等於) '<END>'
  • 再做一遍。

暫無
暫無

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

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