Python - Найти числа, которые не имеют% в конце, используя регулярное выражение - PullRequest
1 голос
/ 09 мая 2019

У меня есть следующий список в Python:
my_list = ['Prix TTC euros : 10,10', 'Prix HT euros 8,42', 'TVA (20.00%) euros : 1,68']

Я хочу получить все числа, такие как 10,10, 8,42 и 1,68 без числа в процентах (20,00%)
Мой код:

my_list = ['Prix TTC euros : 10,10', 'Prix HT euros 8,42', 'TVA (20.00%) euros : 1,68']

for item in my_list:
try:
    found = re.search('([+-]?([0-9]*[,.])?[0-9]+)', item).group()
except AttributeError:
    found = None  # apply your error handling
print(found)

Он печатает:

10,10
8,42
20.00

Я пытался сбежать с последнего найденного числа 20,00 и получить 1,68. Есть ли способ избежать числа, заканчивающегося на% или чем-то другим?

Ответы [ 3 ]

1 голос
/ 09 мая 2019

Существует способ избежать сопоставления процентных значений с границей слова, за которой следует отрицательный знак, который будет отклонять совпадения с символом %:

import re

my_list = ['Prix TTC euros : 10,10', 'Prix HT euros 8,42', 'TVA (20.00%) euros : 1,68']

for item in my_list:
    found = re.search(r'[-+]?\b(?!\d+(?:[,.]\d+)?%)\d+(?:[.,]\d+)?', item)
    if found:
        print(found.group())

См. Демонстрационную версию Pythonонлайн , вывод: ['10,10', '8,42', '1,68'].

См. также regex demo :

  • [-+]? - необязательно - или +
  • \b - граница слова
  • (?!\d+(?:[,.]\d+)?%) - отрицательный прогноз, который не дает совпадения, если есть цифры 1+, необязательная последовательность . или , изатем 1+ цифр сразу справа от текущего местоположения
  • \d+ - 1+ цифр
  • (?:[.,]\d+)? - необязательная последовательность . или , и затем 1+цифры.
1 голос
/ 09 мая 2019

Давайте начнем с вашего регулярного выражения:

found = re.search(r'([+-]?(?:[0-9]*[,.])?[0-9]+)', item).group()

это работает, как вы упомянули. Нам нужно добавить % в конце этого регулярного выражения как отрицательный прогноз

found = re.search(r'([+-]?(?:[0-9]*[,.])?[0-9]+)(?!%)', item).group()

что печатает:

10,10
8,42
20.0  # <---- note the last digit is missing here

поэтому, чтобы настроить это регулярное выражение в дальнейшем, нам нужно исключить целую числовую комбинацию, которую мы сопоставили (т. Е. ([+-]?(?:[0-9]*[,.])?[0-9]+)), ЕСЛИ она заканчивается на %.

Таким образом, мы получаем:

found = re.search(
    r'([+-]?(?:[0-9]*[,.])?[0-9]+)(?!(?:%|(?:[+-]?(?:[0-9]*[,.])?[0-9]+)))',
    item
).group

что дает то, что мы хотим:

10,10
8,42
1,68
0 голосов
/ 09 мая 2019

Вместо того, чтобы смотреть в будущее с отрицательным прогнозом, попробуйте использовать положительное, завершив выражение на (?=[^0-9,.%]|$) - «за которым следует что-то, что не %, дальнейшие части числа или вообще ничего».

Либо просто извлеките все последовательности [0-9.,%]+ и используйте Python, чтобы выбрасывать плохие совпадения.

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