Всем доброго времени суток!
На сей раз прихожу с двумя небольшими вопросами. Выложу код целиком - он довольно большой, но вопросы совсем маленькие.
Вот код:
Вопрос 1:
В fluence неправильно отображается одна строчка. Вот из этого файла: https://gcn.gsfc.nasa.gov/gcn3/5570.gcn3 должно браться из строки:
"The burst fluence is ~4x10-6 erg/cm2" значение: "4x10-6". Но почему-то сейчас берется что-то вообще не то: "intervalT0-(T0+8s).Theb". Подскажите, пожалуйста, как настроить правильно отображение этого значения? Ну и чтобы другие значения из других файлов от этого не стали неправильно отображаться...
Вопрос 2:
В peak_fl не могу нормально настроить отображение значений из нескольких файлов:
https://gcn.gsfc.nasa.gov/gcn3/4564.gcn3
Там все нужные мне значения объединены тем, что после них идет пробел и msec. Например отсюда:
"peak flux measured from T0+0.448 sec on 64 msec time scale" мне надо взять "64", за которым идет msec. И вот не пойму, как это сделать через регулярные выражения( А msec надо обязательно, чтоб осталось, тк потом там дальше это значение нужно будет делить на 1000 этой строкой: #peak_fl = float(peak_fl.replace('msec', ''))/ 1000.
Также прикладываю список ссылок, с которыми работает программа. И буду благодарная за любую помощь!
На сей раз прихожу с двумя небольшими вопросами. Выложу код целиком - он довольно большой, но вопросы совсем маленькие.
Вот код:
Python:
from bs4 import BeautifulSoup
import requests
import re
from astropy.table import Table
def write_tab(lst_data):
# b_name, starttime, starttimeUT, duration, fluence, peak_fl, mode, redshift
lst_names = "GCN Name Time TimeHHMMSS Duration Fluence PFscale Mode Z(Redshift)".split()
tab = Table(rows=lst_data, names=lst_names)
tab.write('Burst_info.txt', format='ascii.fixed_width', delimiter='', overwrite=True)
def parce_line(string):
string = string.replace('\n', ' ')
m = re.search('(GRB\s*\d{6}\w |GRB\s*\d{6} |SGR\s*\d+.\d+ |SGR\d+.\d+ |\d+\s*\SGR)', string)
if not m is None:
b_name = m.group(1).replace(' ', '')
else:
b_name = '--'
print(b_name)
if re.search('SGR', b_name):
print("SGR burst - skipping")
return None
m = re.search('in\s+the\s+waiting\s+mode', string)
if m:
print("Waiting mode - skipping")
return None
m = re.search('(T0\s*=\s*(\d+\.\d+) | starting at\s*(\d+)\s* | T0....\s*=\s*(\d+) | T0.....\s*=\s*(\d+)'
'| T0\s*=\s*(\d+) | at\s*(\d+\.\d+)\s* | T0....\s*=\s*(\d+\.\d+)'
'| T0\s*=\s*(\d+\.\d+) | \(T0....\s*=\s*(\d+\.\d+) | T0\s*=\s*(\d+\.\d+)\w)', string)
if not m is None:
starttime = m.group().replace('T0=', '').replace(' at ', '').replace(' ', '').replace('T0(KW)=', '').replace('(', '').replace('s', '')
else:
starttime = '--'
print(starttime)
m = re.search('in\s+the\s+waiting\s+mode', string)
if m:
print("Waiting mode - skipping")
return None
m = re.search('(UT..(\d{2}:\d{2}:\d{2}.\d+)|T0.........(\d{2}:\d{2}:\d{2})|T0......(\d{2}:\d{2}:\d{2})'
'|UT..(\d{2}:\d{2}:\d{2})|T0.......(\d{2}:\d{2}:\d{2}.\d+)'
'|T0.......(\d{2}:\d{2}:\d{2})|(UT...(\d{2}:\d{2}:\d{2}.\d+))'
'|(\d..(\d{2}:\d{2}:\d{2}.\d+))|at.(\d{2}:\d{2}:\d{2}.\d+))', string)
if not m is None:
starttimeUT = m.group().replace('T0=T0(BAT)=','').replace('UT (','').replace('T0(BAT)= ','').replace('T0(BAT)=','').replace('T0(MAXI)=','').replace('UT (','').replace('5 (','').replace('at ','')
else:
starttimeUT = '--'
print(starttimeUT)
m = re.search('((duration\s+(?:of|is)\s*~\s*(\d+(?:\.\d+)?)\s*(s|ms))|(duration of the burst is\s*.(\d+\.\d+)\s*(s|ms))'
'|(duration of the burst is\s*.(\d+)\s*(s|ms))|(duration of\s*(\d+\.\d+)\s*(s|ms))'
'|(duration of\s*.(\d+)\s*(s|ms))|(burst\s......\s\w\w\s*.(\d+)\s*(s|ms))|(duration\s*.(\d+)\s*(s|ms))'
'|(duration\s......\s\w{2}\s*.(\d+)\s*(s|ms))|(of\s\w{5}\s*.(\d+)\s*(s|ms))'
'|(\d{4}\s\w{3}.\s\w\w\s*.(\d+\.\d+)\s*(s|ms))|(duration\s\w{2}\s\w{5}\s(\d+\.\d+)\s*(s|ms))'
'|(duration\s\w{2}\s\w{5}\s.(\d+\.\d+)\s*(s|ms))|(duration\s\w{2}\s\w{3}\s\w{5}.\s\w{2}\s*.(\d+)\s*(s|ms))'
'|(duration\s\w{2}\s\w{5}\s(\d+)\s*(s|ms))|(\d{4}\s\w{3}.\s\w\w\s*.(\d+)\s*(s|ms))'
'|(duration\s\w{2}\s\w{3}\s\w{5}\s\w{2}\s\w{2}\s*.(\d+\.\d+)\s*(s|ms))|(about\s*.(\d+)\s*(s|ms))'
'|(duration\s\w{2}\s\w{3}\s\w{5}\s\w{2}\s*.(\d+)\s*.(s|ms))|(duration\s\w{2}\s\w{3}\s\w{5}\s*.(\d+)\s*.(s|ms))'
'|(\d{3}\s\w{3}.\s\w\w\s*.(\d+)\s*(s|ms))|(duration\s.(\d+\.\d+)\s*(s|ms)))', string)
if not m is None:
duration = m.group(1).replace('duration of ~', '').replace('duration of the burst is ~', '').replace('duration of~', '').replace('duration is ~', '').replace('duration of ~', '').replace(' ', '').replace('burst(T100)is~', '').replace('duration(T100)of~', '').replace('durationof', '').replace('ofabout', '').replace('`', '').replace('1300keV)is~', '').replace('360keV)is~', '').replace('1400keV)of~', '').replace('theburstis~', '').replace('durationisabout', '').replace('duration~', '').replace('about', '').replace('theburstinis~', '').replace('~', '').replace('theburstof', '').replace('theburst', '')
else:
duration = '--'
print(duration)
m = re.search('(fluence\s+of\s+(.+?)\s*erg|\d{4}\s\w{3}\s\w{4}\s\w{2}\s+(..................)'
'|interval\s\w{2}\s+(...................)|fluence\s+(.+?)\s*erg)'
'|fluence\s\w{2}\s+(.......)\s+erg/cm2', string)
if not m is None:
fluence = m.group(1).replace('1500 keV band is ','').replace('fluence of ','').replace(' erg','').replace('interval is ','').replace(' e','').replace('fluence ','').replace('this part is ','').replace('is ','').replace('the most intense part of the burst ','').replace(' ','').replace('~','').replace('theburstsapproximately','')
else:
fluence = '--'
print(fluence)
peak_fl = re.search(('\d{1}.\d{1,4}-s|\d{1,4}-ms|measured\s\w\w\s\w\s\d{1}.\d{1,3}|cm2\s\w{3}\s\w\s\d{1}.\d{1,3}'
'|followed\s\w{2}\s.\d{1,3}|and\s\w\s\d{1,3}-s|started\s\w{2}\s\d{1,3}|over\s\d{1}.\d{1,3}'), string)
if peak_fl != None:
peak_fl = peak_fl.group(0)
if peak_fl.find('-ms') != -1:
peak_fl = float(peak_fl.replace('-ms', ''))/ 1000
#peak_fl = float(peak_fl.replace('msec', ''))/ 1000
peak_fl = str(peak_fl)
peak_fl = peak_fl.replace('-ms', '').replace('-s', '').replace('measured on a ', '').replace('cm2 and a ', '').replace('followed in ~', '').replace('and a ', '').replace('started at ', '').replace('over ', '')
print(peak_fl)
else:
peak_fl = '--'
print(peak_fl)
m = re.search('triggered|waiting\s*mode', string)
if not m is None:
mode = m.group(0).replace(' ', '')
else:
mode = '--'
print(mode)
m = re.search(r'z\s*=\s*(\d+(?:\.\d+)?)', string)
if m is None:
redshift = '--'
else:
redshift = m.group(1)
print(redshift)
return [b_name, starttime, starttimeUT, duration, fluence, peak_fl, mode, redshift]
def main():
with open("links.txt") as f:
lines = f.read().split('\n')
lst_data = []
for line in lines:
line = line.strip()
print(line)
str_gcn = line[-10:-5]
response = requests.get(line)
soup = BeautifulSoup(response.content, "lxml")
ptag = soup.find(lambda tag: tag.name == 'p')
string = str(ptag)
res = parce_line(string)
if not res is None:
lst_data.append([str_gcn,] + res)
write_tab(lst_data)
main()
В fluence неправильно отображается одна строчка. Вот из этого файла: https://gcn.gsfc.nasa.gov/gcn3/5570.gcn3 должно браться из строки:
"The burst fluence is ~4x10-6 erg/cm2" значение: "4x10-6". Но почему-то сейчас берется что-то вообще не то: "intervalT0-(T0+8s).Theb". Подскажите, пожалуйста, как настроить правильно отображение этого значения? Ну и чтобы другие значения из других файлов от этого не стали неправильно отображаться...
Вопрос 2:
В peak_fl не могу нормально настроить отображение значений из нескольких файлов:
https://gcn.gsfc.nasa.gov/gcn3/4564.gcn3
Там все нужные мне значения объединены тем, что после них идет пробел и msec. Например отсюда:
"peak flux measured from T0+0.448 sec on 64 msec time scale" мне надо взять "64", за которым идет msec. И вот не пойму, как это сделать через регулярные выражения( А msec надо обязательно, чтоб осталось, тк потом там дальше это значение нужно будет делить на 1000 этой строкой: #peak_fl = float(peak_fl.replace('msec', ''))/ 1000.
Также прикладываю список ссылок, с которыми работает программа. И буду благодарная за любую помощь!