Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Переделка регулярных выражений для Python

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

1. Kibor - 30 Октября, 2023 - 09:09:06 - перейти к сообщению
Кто может переделать эти регулярки на такие же корректные для 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}\/)"

нет


Пример задачи(для просмотра ссылки Вам необходимо авторизоваться)
2. Zireael - 30 Октября, 2023 - 18:56:44 - перейти к сообщению
Я уже давно предлагал в 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?

Если не разберётесь то скиньте пример текста, подправлю.
3. Kibor - 30 Октября, 2023 - 23:25:37 - перейти к сообщению
Спасибо.
 Zireael пишет:
в (?<=) нельзя использовать квантификаторы нефиксированной длины. Можно указывать точное количество символов .{45}, диапазон .{0,45} нельзя.

Это конкретно в Python нельзя я так понимаю..
4. Kibor - 08 Ноября, 2023 - 10:53:41 - перейти к сообщению
Да уж...


Это работает корректно с 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)

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


Но вопрос актуален.. По поиску только одного вхождения по данному регулярному выражению.
Или другому, которое будет соответствовать условию (для просмотра ссылки Вам необходимо авторизоваться)
5. Kibor - 08 Ноября, 2023 - 13:07:03 - перейти к сообщению
Короче вот
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])
6. Zireael - 08 Ноября, 2023 - 16:47:44 - перейти к сообщению
 Цитата:
Короче вот

Не так. Найдёт число даже если перед ним нет 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])
7. Kibor - 08 Ноября, 2023 - 18:41:42 - перейти к сообщению
 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
8. Zireael - 09 Ноября, 2023 - 02:27:22 - перейти к сообщению
 Цитата:
Возврат нужен всегда в предсказуемый индекс. В 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')
9. Kibor - 09 Ноября, 2023 - 03:48:02 - перейти к сообщению
 Zireael пишет:
А что тут непредсказуемого? Либо нашлось, первая подгруппа, либо не нашлось, тогда if не выполнится.

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

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

2 пары круглых скобок, 2 группы, но т. к. во второй паре скобок вначале ?:, то выражение в этих скобках не является группой, поэтому вернёт 1 группу.

Powered by ExBB FM 1.0 Final