Я извлекаю данные со страницы с несколькими пользовательскими рейтингами, что означает, что синтаксис немного небрежный.
Текст выглядит примерно так:
<span date="12/10/2014">4.957/10</span>
<span date="12/10/2014">11/10</span>
<span date="12/10/2014">5 / 10</span>
<span date="12/10/2014">i say: 9 /10</span>
<span date="12/10/2014">10/ 10</span>
<span date="12/10/2014">0.1/10, no more</span>
как бы вы пошли за получением этих рейтингов?
рейтинги будут идти от 0 до 1000000 и иметь максимум 3 знака после запятой.
Полученный массив из вышеперечисленного должен быть:
4.957
11
5
9
10
0.1
Так что в основном правила должны идти так:
* Сопоставьте любое число с «/ 10» позади него.
* За номером может следовать точка и до 3 дополнительных цифр.
* Между / и рейтингом может быть пробел, также между / и 10.
* Не должно быть другого / после / 10.
Если бы я был тобой, я бы просто схватил число, а затем за пределами регулярного выражения выяснил, укладывается ли оно в твои пределы:
'(\d+(?:\.\d{1,3})?)\s*/\s*10(?![^<]*/)'
Я понял, что мой сбой, когда было больше трех знаков после запятой (получил неправильный номер), так что вот лучше:
'(?<![\d.])(\d+(?:\.\d{1,3})?)\s*/\s*10(?![^<]*/)'
Попробуйте это регулярное выражение:
[\d]+\.?[\d]*|[\d]*\.?[\d]+
Что он на самом деле делает, так это сопоставляет первое вхождение числа в строке, которое будет выглядеть как 10 или 0,10 или .10 или 10. (части числа могут содержать любую цифру).
Для лучшего объяснения того, что он видит: https://www.regex101.com/