使用正则表达式从文本文件中提取值
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
如果你真的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>'
- 重新来过。
我有一个文本文件,每当遇到该字符串时,我都想从该文件中提取距该字符串特定距离的值。我对此完全陌生,并且了解到这些类型的模式匹配问题可以使用正则表达式来解决。
<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
如果你真的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>'
- 重新来过。