Kibor |
Отправлено: 30 Октября, 2023 - 16:09:06
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Кто может переделать эти регулярки на такие же корректные для 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:"(?<=ck__[^c].{0,45})[+-]?\d+(\.\d+)?(?=.{0,5}\/)"
нет
Пример задачи(для просмотра ссылки Вам необходимо авторизоваться) |
|
|
Zireael |
Отправлено: 31 Октября, 2023 - 01:56:44
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Я уже давно предлагал в 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?
Если не разберётесь то скиньте пример текста, подправлю. |
|
|
Kibor |
Отправлено: 08 Ноября, 2023 - 18:53:41
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Да уж...
Это работает корректно с 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)
...............................
Но вопрос актуален.. По поиску только одного вхождения по данному регулярному выражению.
Или другому, которое будет соответствовать условию (для просмотра ссылки Вам необходимо авторизоваться) |
|
|
Zireael |
Отправлено: 09 Ноября, 2023 - 00:47:44
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Короче вот
Не так. Найдёт число даже если перед ним нет 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]) |
|
|
Kibor |
Отправлено: 09 Ноября, 2023 - 02:41:42
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
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 |
|
|
Zireael |
Отправлено: 09 Ноября, 2023 - 10:27:22
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Возврат нужен всегда в предсказуемый индекс. В 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') |
|
|
Zireael |
Отправлено: 09 Ноября, 2023 - 12:16:47
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: сколько там этих подгрупп может быть в зависимости от регулярки
Сколько круглых скобок, столько групп.
CODE:([+-]?\d+(?:\.\d+)?)
2 пары круглых скобок, 2 группы, но т. к. во второй паре скобок вначале ?:, то выражение в этих скобках не является группой, поэтому вернёт 1 группу. |
|
|
|