Regex - найти все виды чисел в строке перед указанным c символом - PullRequest
2 голосов
/ 20 января 2020

Я хочу извлечь число из списка указанных c символов. Я хочу извлечь объем, Pirce и многое другое с разных веб-сайтов.

Например, я хочу извлечь Том отсюда:

<td class="data">Single Malt Scotch Whisky der Marke Speyburn 10 Years 40% 0,7l Flasche</td>
or
<td class="data">Irish Whiskey der Marke Bushmills  the Original 40% 1,0l Flasche</td>

Я попробовал следующий код:

re.findall("[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*?(?=l|L|Liter| Liter| l| L|ml)", string)

И вот результат:

First String = ['7'] and Second String = ['0']

Как получить полное число (0,7 и 1,0)?

Для тома, который я пытался преобразовать запятой в точку. Это прекрасно работает для объема, но не для цены.

                    if ',' in string:
                        string= string.replace(',', '.')

Если это возможно, я хочу использовать регулярное выражение также для цены. Сложность здесь заключается в разных типах чисел. Доступны следующие типы:

  • 10,00 €
  • 10,00 €
  • 1234,56 €
  • 1,234,56 €

1 Ответ

2 голосов
/ 20 января 2020

Вы можете использовать

[-+]?\.?\d+(?:[.,]\d+)*(?= ?[mM]?[lL])

См. Демоверсию regex . Чтобы сопоставить единицы измерения как целые слова, добавьте \b границу слова в конце шаблона прогнозирования, (?= ?(?:[mM]?[lL]|[Ll]iter)\b).

Подробности

  • [-+]? - необязательный - или +
  • \.? - необязательный .
  • \d+ - 1+ цифр
  • (?:[.,]\d+)* - 0 или более вхождений точки или запятой, а затем 1+ цифр
  • (?= ?[mM]?[lL]) - положительный прогноз, соответствующий местоположению, за которым сразу следует
    • \? - необязательный пробел ( вы можете использовать \s? здесь для соответствия любому пробелу)
    • [mM]? - необязательный m или M
    • [lL] - l или L.

Обратите внимание, что вам не нужно Liter альтернативное в предвкушении, если вы используете (?= ?[mM]?[lL]), но если вы используете границу слова, вам нужно будет использовать Liter альтернатива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...