使用正则表达式从文本文件中提取值

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

如果你真的want/need使用正则表达式,你可以这样做。

代码:

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]

然而,正如其他人所指出的那样,还有其他方法可以做到这一点而无需重新。

Or any other way...

没有正则表达式,只有字符串函数

  • 迭代文件中的行
  • 检查行(以、包含或等于)'<BEGIN> AUTO,CHANSTATE'
    • 当出现时,跳过接下来的两行
  • 继续迭代,对于以 '<CH>' 开头的每一行,
    • 按空格拆分行,保存结果的第三项(result[2])
  • 继续直到一行(以、包含或等于)'<END>'
  • 重新来过。