Вопросы по регулярным выражениям

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
И вновь доброго времени суток!
На сей раз у меня пара небольших вопросов по регулярным выражениям. Код следующий:
Код:
from bs4 import BeautifulSoup
import requests
import re
from astropy.table import Table


def write_tab(lst_data):
    # b_name, starttime, starttimeUT
    lst_names = "GCN Name Time TimeHHMMSS".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)

    #m = re.search('(T0\s*=\s*(\d+\.\d+) |T0....\s*=\s*(\d+))', string) #don`t work!
    #m = re.search('(T0\s*=\s*(\d+\.\d+))', string)
    #m = re.search('(starting at\s*(\d+)\s*)', string)   #https://gcn.gsfc.nasa.gov/gcn3/13736.gcn3
    #m = re.search('(T0....\s*=\s*(\d+))', string)       #https://gcn.gsfc.nasa.gov/gcn3/13351.gcn3
                                                         #https://gcn.gsfc.nasa.gov/gcn3/11971.gcn3
                                                         #https://gcn.gsfc.nasa.gov/gcn3/11951.gcn3
    #m = re.search('(T0.....\s*=\s*(\d+))', string)      #https://gcn.gsfc.nasa.gov/gcn3/12663.gcn3
    #m = re.search('(T0\s*=\s*(\d+))', string)           #https://gcn.gsfc.nasa.gov/gcn3/10228.gcn3
    #m = re.search('(at\s*(\d+\.\d+)\s*)', string)       #https://gcn.gsfc.nasa.gov/gcn3/5841.gcn3
                                                         #https://gcn.gsfc.nasa.gov/gcn3/5570.gcn3
    #if not m is None:
        #starttime = m.group(2)
    #else:
        #starttime = '--'
    #print(starttime)


    m = re.search('\d{2}:\d{2}:\d{2}.\d+.', string)
    if not m is None:
        starttimeUT = m.group(3)
    else:
        starttimeUT = '--'
    print(starttimeUT)

    return [b_name, starttimeUT]

def main():

    with open("links.txt") as f:
        lines = [line.rstrip('\n') for line in f]
    
    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)

        lst_data.append([str_gcn,] + parce_line(string))
    
    write_tab(lst_data)

main()
Тут правильно работает первая часть, про b_name. А вот с starttime почему-то так же не получается написать, чтобы поиск шел: или.... или... или... По отдельности строки работают и находят из документов то, что нужно. Но, если их писать в одну строку через | - то не получается. К этому вопросу прикладываю список ссылок, которые должны все обрабатываться (links2.txt). И это первый вопрос. Второй - со starttimeUT выдает "No such group" и не ищет( Хотя я, вроде, правильно написала выражение для поиска. Он должен искать цифры формата чч:чч:чч.ччч, но нет. Опытным путем выяснила, что без точки тут: m = re.search('\d{2}:\d{2}:\d{2}.\d+.', string) ошибку про группу не выдает, но точка-то там нужна( К этому вопросу прикладываю полный список ссылок, на всякий случай (links.txt).
Заранее благодарю за любую помощь!
 

Вложения

  • links2.txt
    340 байт · Просмотры: 1
  • links.txt
    27,7 КБ · Просмотры: 1

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 567
455
83
вроде работает
Python:
...

    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*)', string)

    if not m is None:
        starttime = m.group()
    else:
        starttime = '--'
    print(starttime)

    m = re.search('\d{2}:\d{2}:\d{2}.\d+', string)
    if not m is None:
        starttimeUT = m.group()
    else:
        starttimeUT = '--'
    print(starttimeUT)
    
...
 
Последнее редактирование:
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
вроде работает
Python:
...

    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*)', string)

    if not m is None:
        starttime = m.group()
    else:
        starttime = '--'
    print(starttime)

    m = re.search('\d{2}:\d{2}:\d{2}.\d+', string)
    if not m is None:
        starttimeUT = m.group()
    else:
        starttimeUT = '--'
    print(starttimeUT)
   
...
И вновь спасибо Вам!) Работает, да)
 

Форум IT Специалистов