Ошибки в регулярных выражениях

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Всем доброго времени суток!
У меня есть следующий код:
Python:
from bs4 import BeautifulSoup
import requests
import re

with open("List_of_links.txt") as f:
lines = [line.rstrip('\n') for line in f]
for line in lines:
  response = requests.get(line)
  soup = BeautifulSoup(response.content, "lxml")
  ptag = soup.find(lambda tag: tag.name == 'p')

  string=str(ptag)

  b_name=re.search('GRB\s\d\w\w\w\w\w\w', string)
  print(b_name.group(0))

  starttime=re.search('T0=\d\d\d\d\d\.\d\d\d\s' | 'T0=\d\d\d\d\d\.\d\d\s' | 'T0=\d\d\d\d\.\d\d\s', string)
  print(starttime)

  starttimeUT=re.search('UT\s\:\d\d\:\d\d\:\d\d\.\d\d\d\s', string)
  print(starttimeUT)

  duration=re.findall('duration of ~\w\w\w\w\s', string)
  print(duration)

  fluence=re.findall('fluence of\s\???', string)
  print(fluence))

  peak_fl=re.findall('\d\d\-ms' | '\d\d\d\-s', string)
  print(peak_fl)

Он должен находить в тексте разные численные значения. Первое значение, b_name находит, а вот дальше начинаются проблемы. По порядку:
1. starttime у меня нескольких видов. Какое-то количество цифр до точки и какое-то после. Как мне это реализовать в коде, чтобы получить набор цифр (вида 9267.293)? Я попыталась сделать несколько вариантов через | (то есть, чтобы находилось или одно или другое или третье), но не работает(
2. starttimeUT вида UT (19:56:54.617). Мне надо, чтобы осталось только 19:56:54.617, но мой вариант так же, по-видимому, содержит ошибку(
3. duration вида duration of ~xxx.xxx s. Мне нужно вытащить все символы (их количество произвольное) между duration of ~ и s, чтобы получить цифры вида: 0.37. Опять же мой вариант не совсем правильный, похоже(
4. fluence проблема та же, что с duration. Он вида: fluence of 3.12(-0.61,+0.94)x10^-6 erg/cm2. То есть нужны все символы между fluence of и erg/cm2 (их количество так же произвольно).
5. И наконец peak_fl работает, если убрать | '\d\d\d\-s, но мне нужно, чтобы находило или первый вариант или второй или как-то задать произвольное количество символов. И так же, чтобы результат выдавался без -ms / -s, только числа.
Так же прикладываю файл, который используется в коде. Работаю на Python 3.9.0.
Буду рада любой помощи и заранее спасибо.
 

Вложения

  • List_of_links.txt
    600 байт · Просмотры: 1

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 566
454
83
а вам принципиально регулярки нужны?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 566
454
83
я в регулярках не особо силен, но вот пример вроде работает (duration и fluence просто поиск по строке, не регулярка)
Python:
from bs4 import BeautifulSoup
import requests
import re

with open("List_of_links.txt") as f:
    lines = [line.rstrip('\n') for line in f]

for line in lines:
    response = requests.get(line)
    soup = BeautifulSoup(response.content, "lxml")
    ptag = soup.find(lambda tag: tag.name == 'p')

    string = str(ptag)

    b_name = re.search('GRB \d{6}', string)
    if b_name != None:
        print(b_name.group(0))
    else:
        print('Не найдено')

    starttime = re.search('T0=\d{1,5}.\d{1,5}', string)
    if starttime != None:
        print(starttime.group(0))
    else:
        print('Не найдено')

    starttimeUT = re.search('\d{2}:\d{2}:\d{2}.\d{1,5}', string)
    if starttimeUT != None:
        print(starttimeUT.group(0))
    else:
        print('Не найдено')

    duration = string[string.find('duration of ~'):string.find(' s.')]
    if duration != '':
        print(duration[duration.find('~'):])
    else:
        print('Не найдено')

    fluence = string[string.find('fluence of '):string.find(' erg/')]
    if fluence != None:
        print(fluence[fluence.find('of ') + 3:])
    else:
        print('Не найдено')

    peak_fl = re.findall(('\d{1,3}-s | \d{1,3}-ms'), string)
    print(peak_fl)

    print('===========КОНЕЦ============')
 
Последнее редактирование:

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
я в регулярках не особо силен, но вот пример вроде работает (duration и fluence просто поиск по строке, не регулярка)
Python:
from bs4 import BeautifulSoup
import requests
import re

with open("List_of_links.txt") as f:
    lines = [line.rstrip('\n') for line in f]

for line in lines:
    response = requests.get(line)
    soup = BeautifulSoup(response.content, "lxml")
    ptag = soup.find(lambda tag: tag.name == 'p')

    string = str(ptag)

    b_name = re.search('GRB \d{6}', string)
    if b_name != None:
        print(b_name.group(0))
    else:
        print('Не найдено')

    starttime = re.search('T0=\d{1,5}.\d{1,5}', string)
    if starttime != None:
        print(starttime.group(0))
    else:
        print('Не найдено')

    starttimeUT = re.search('\d{2}:\d{2}:\d{2}.\d{1,5}', string)
    if starttimeUT != None:
        print(starttimeUT.group(0))
    else:
        print('Не найдено')

    duration = string[string.find('duration of ~'):string.find(' s.')]
    if duration != '':
        print(duration[duration.find('~'):])
    else:
        print('Не найдено')

    fluence = string[string.find('fluence of '):string.find(' erg/')]
    if fluence != None:
        print(fluence[fluence.find('of ') + 3:])
    else:
        print('Не найдено')

    peak_fl = re.findall(('\d{1,3}-s | \d{1,3}-ms'), string)
    print(peak_fl)

    print('===========КОНЕЦ============')
Вот спасибо вам огромное *_* Вроде, все как надо работает))))
 

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