Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (2): [1] 2 »   

> Без описания
Kibor
Отправлено: 30 Октября, 2023 - 16:09:06
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Кто может переделать эти регулярки на такие же корректные для Python?
CODE:
"(?<=__name-item(.){0,5}>)(.*?)(?=<\/span>)"
"(?<=ck__[^c].{0,45})[+-]?\d+(\.\d+)?(?=.{0,5}\/)"


 Цитата:
К примеру такая
CODE:
"(?<=__name-item(.)>)(.*?)(?=<)"

работает.


 Цитата:
Такая
CODE:
"(?<=__name-item(.){0,5}>)(.*?)(?=<\/span>)"

нет


=============================

 Цитата:
Такая
CODE:
"\d{1,3}\.\d"

работает


 Цитата:
Такая
CODE:
"(?<=ck__[^c].{0,45})[+-]?\d+(\.\d+)?(?=.{0,5}\/)"

нет


Пример задачи(для просмотра ссылки Вам необходимо авторизоваться)
 
 Top
Zireael
Отправлено: 31 Октября, 2023 - 01:56:44
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4398
Дата рег-ции: Нояб. 2017  
Репутация: 580




Я уже давно предлагал в regexsearch доделать возвращение в результат найденные группы.
Что касается регулярок, то на https://regex101.com/ пишет где допущены ошибки. Тут же и регулярки можно тестить, покажет что найдено.
 Цитата:
(?<=ck__[^c].{0,45})

Если вкратце, то в (?<=) нельзя использовать квантификаторы нефиксированной длины. Можно указывать точное количество символов .{45}, диапазон .{0,45} нельзя.
 Цитата:
Пример задачи

Выполнить код в консоли python:
CODE:
import re

match = re.findall(r'(?<=sections-block__).{0,45}?([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sections-block__right-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')
print(match[0] if match else 'Not found')



Примеры по-проще как использовать группы:
CODE:
import re
match = re.findall(r'x = \d+, y = \d+', r'x = 123, y = 456')
print(match[0] if match else 'Not found')

Групп нет, вернёт: x = 123, y = 456
CODE:
import re
match = re.findall(r'x = (\d+), y = (\d+)', r'x = 123, y = 456')
print(match[0] if match else 'Not found')

вернёт 2 группы ('123', '456' ), т. к. (\d+) в скобках
CODE:
import re
match = re.findall(r'x = (?:\d+), y = (\d+)', r'x = 123, y = 456')
print(match[0] if match else 'Not found')

вернёт 456, т. к. (?:\d+) является незахватываемой группой.

 Цитата:
Кто может переделать эти регулярки на такие же корректные для Python?

Если не разберётесь то скиньте пример текста, подправлю.
 
 Top
Kibor
Отправлено: 31 Октября, 2023 - 06:25:37
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Спасибо.
 Zireael пишет:
в (?<=) нельзя использовать квантификаторы нефиксированной длины. Можно указывать точное количество символов .{45}, диапазон .{0,45} нельзя.

Это конкретно в Python нельзя я так понимаю..
 
 Top
Kibor
Отправлено: 08 Ноября, 2023 - 18:53:41
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Да уж...


Это работает корректно с findall
Только не пойму почему подстрока .{0,45}? не включена в результат.. Хотя такой результат и нужен
Выводит
+1.9
CODE:
import re

match = re.findall(r'(?<=sections-block__).{0,45}?([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sections-block__right-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')
print(match[0])


То же самое с search по другому.
Выводит
right-kf ng-star-inserted^"> +1.9
Ну хотя вполне понятно что .{0,45}? будет включено в результат тут... Но надо что бы было как с findall
CODE:
import re

match = re.search(r'(?<=sections-block__).{0,45}?([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sections-block__right-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')
print(match[0])


Короче search и findall по разному трактуют одно и то же регулярное выражение..
(Добавление)
Короче я так понимаю это баг питона. А конкретно функции search
И нигде не описанный..
Теперь вопрос...
Как находить только первое вхождение, без долгого поиска findall всего что уже не надо..

Баг такой..
Это возвращает
+1.9
CODE:
import re

match = re.findall(r'(?<=sections-block__).{0,45}?([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sections-block__right-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')
print(match[0])



Это возвращает
right-kf ng-star-inserted^"> +1.9
CODE:
import re

match = re.search(r'(?<=sections-block__).{0,45}?([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sections-block__right-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')
print(match[0])


Нет.. Это не баг..
Это подгруппы..

match.group(0)
match.group(1)

...............................


Но вопрос актуален.. По поиску только одного вхождения по данному регулярному выражению.
Или другому, которое будет соответствовать условию (для просмотра ссылки Вам необходимо авторизоваться)
 
 Top
Kibor
Отправлено: 08 Ноября, 2023 - 21:07:03
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Короче вот
CODE:


import re

match = re.search(r'(?<=sections-block__.)?([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sections-block__right-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')
print(match[0])
 
 Top
Zireael
Отправлено: 09 Ноября, 2023 - 00:47:44
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4398
Дата рег-ции: Нояб. 2017  
Репутация: 580




 Цитата:
Короче вот

Не так. Найдёт число даже если перед ним нет sections-block__.
CODE:
import re

match = re.search(r'(?<=sections-block__).{0,45}?([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sections-block__right-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')
print(match[1])
 
 Top
Kibor
Отправлено: 09 Ноября, 2023 - 02:41:42
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




 Zireael пишет:
print(match[1])

Такой вариант не подходит.
Возврат нужен всегда в предсказуемый индекс. В 0.
Кроме этого поиск должен быть не всего, а только одного первого и выходить с поиска.
(Добавление)
Тогда хоть так..


CODE:
import re

match = re.search(r'(?<=>).{0,5}?([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sectiot-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')
print(match[0])

(Добавление)
Хотя так тоже не подходит например в этом случае
CODE:
line-list-dops-item-row-sectiot-kf ng-star-inserted^"> Ф1.9 </div><!+---><!-++-></div><!---+></div><div
 
 Top
Zireael
Отправлено: 09 Ноября, 2023 - 10:27:22
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4398
Дата рег-ции: Нояб. 2017  
Репутация: 580




 Цитата:
Возврат нужен всегда в предсказуемый индекс. В 0.

А что тут непредсказуемого? Либо нашлось, первая подгруппа, либо не нашлось, тогда if не выполнится.
CODE:
import re

match = re.search(r'(?<=sections-block__).{0,45}?>\s*([+-]?\d+(?:\.\d+)?)(?=.{0,10}\/div>)',
r'line-list-dops-item-row-sections-block__right-kf ng-star-inserted^"> +1.9 </div><!+---><!-++-></div><!---+></div><div')

if match:print(match[1])
else:print('Not found')
 
 Top
Kibor
Отправлено: 09 Ноября, 2023 - 11:48:02
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8098
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




 Zireael пишет:
А что тут непредсказуемого? Либо нашлось, первая подгруппа, либо не нашлось, тогда if не выполнится.

Ну об этом я тоже подумывал, но это костыль какой то.
Честно говоря я не знаю сколько там этих подгрупп может быть в зависимости от регулярки.
Конечно можно перебирать в цикле, но как то неправильно..
 
 Top
Zireael
Отправлено: 09 Ноября, 2023 - 12:16:47
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4398
Дата рег-ции: Нояб. 2017  
Репутация: 580




 Цитата:
сколько там этих подгрупп может быть в зависимости от регулярки

Сколько круглых скобок, столько групп.
CODE:
([+-]?\d+(?:\.\d+)?)

2 пары круглых скобок, 2 группы, но т. к. во второй паре скобок вначале ?:, то выражение в этих скобках не является группой, поэтому вернёт 1 группу.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы и решение проблем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by