Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2017 06:21:14

roggerg
Зарегистрирован: 2015-03-12
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Опять регулярные выражения

После парсинга сайта у меня получился список строк такого вида

 '5X\xa0\xa0\n\n\xa0\n\n\n\n\n\n3/31/2007\n2\n5\n16\n36\n40\n\xa0\n36\n\xa0\n\n\n\xa0\r\n'
Мне нужно забрать только дату и шесть чисел т.е.
 ['3/31/2007', '2', '5', '16', '36', '40', '36']
для даты у меня есть регулярка вида
 r = r"\d{1,2}\/\d{1,2}\/\d{4}"
Числа могут быть в диапозоне от 0 до 99, пять чисел идет сразу после даты а перед последним числом (здесь это 36) идет выражение \n\xa0\n, которое надо пропустить
Я думал использовать (.) т.к. это вроде любой символ кроме переноса строки (\n), но у меня что-то не получается. Или думал после даты использовать (\d{1,2}), но тоже захвата не получилось. Можно сделать
через (\d+) и дальше обработать результат, но это как-то не красиво.
Вообщем прошу помощи в составлении регулярки.

Отредактировано roggerg (Окт. 12, 2017 07:26:21)

Офлайн

#2 Окт. 12, 2017 08:46:41

roggerg
Зарегистрирован: 2015-03-12
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Опять регулярные выражения

Составил в итоге такое выражение

  r = r'(\d{1,2}\/\d{1,2}\/\d{4})\n(\d{1,2})\n(\d{1,2})\n(\d{1,2})\n(\d{1,2})\n(\d{1,2})\n\xa0\n(\d{1,2})'
на выходе получился список с кортежем
 [('3/31/2007', '2', '5', '16', '36', '40', '36')]
В принципе уже лучше, но хотелось бы получить список строк.

Офлайн

#3 Окт. 12, 2017 23:58:38

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Опять регулярные выражения

 st = "5X\xa0\xa0\n\n\xa0\n\n\n\n\n\n3/31/2007\n2\n5\n16\n36\n40\n\xa0\n36\n\xa0\n\n\n\xa0\r\n"
print(re.findall(r'(?<=\n)(\d{1,2})+?(?!\/)', st))

Офлайн

#4 Окт. 14, 2017 06:14:34

roggerg
Зарегистрирован: 2015-03-12
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Опять регулярные выражения

Romissevd
Спасибо, только как теперь это все совместить чтобы дата тоже захватывалась и на выходе получалось бы
  ['3/31/2007', '2', '5', '16', '36', '40', '36']

Офлайн

#5 Окт. 14, 2017 08:46:21

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Опять регулярные выражения

а регулярка обязательна?

 >>> n =  '5X\xa0\xa0\n\n\xa0\n\n\n\n\n\n3/31/2007\n2\n5\n16\n36\n40\n\xa0\n36\n\xa0\n\n\n\xa0\r\n'
>>> print(n.split()[1::])
['3/31/2007', '2', '5', '16', '36', '40', '36']

Офлайн

#6 Окт. 14, 2017 10:01:05

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Опять регулярные выражения

roggerg
Спасибо, только как теперь это все совместить чтобы дата тоже захватывалась и на выходе получалось бы
 print(re.findall(r'(?<=\n)(\d{1,2}\/\d{1,2}\/\d{4}|\d{1,2})+?(?!\/)', st))
marvellik предложил Вам более лаконичное решение, если Вам не обязательна регулярка

Офлайн

#7 Окт. 16, 2017 08:28:03

roggerg
Зарегистрирован: 2015-03-12
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Опять регулярные выражения

marvellik
Спасибо, отличное решение

Отредактировано roggerg (Окт. 16, 2017 08:28:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version