Как написать регулярное выражение для захвата определенных c числовых форматов и исключения остальных? - PullRequest
2 голосов
/ 13 июля 2020

Я пытаюсь захватить ограниченные истинные случаи из строки со многими другими недопустимыми числовыми случаями в Python Regex. Истинные случаи - это действительный числовой формат с запятыми или числа с запятыми и десятичные дроби. Все остальное недействительно. Пример ниже.

Пример строки ввода:

input = "The net value is 1,000,000.00 however even 100,000 or 1,000,000 is acceptable. The amounts that are not acceptable are 1 000,000.00 or 1.000.000.00 or 1,000,000,00 or 1,000,000,0000"

Результат: 1,000,000.00 100,000 1,000,000

Текущее python регулярное выражение, которое я пробовал, выглядит следующим образом:

\d{1,3}(,{1}\d{3})*(\.{1}\d+){0,1}$

Это работает, только когда вводятся только числа. Когда я пытаюсь ввести числа со словами вокруг них, это не удается.

Ответы [ 2 ]

3 голосов
/ 13 июля 2020

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

(?<!\S)[1-9]\d{0,2}(?:,\d{3})*(?:\.\d+)?(?!\S)

Он использует поисковые запросы, чтобы утверждать, что границы для чисел должны быть либо пробелами, либо началом / концом ввода. Также обратите внимание, что мы настаиваем на том, чтобы каждое действительное число не начиналось с нуля.

Я бы использовал re.findall следующим образом:

inp = "The net value is 1,000,000.00 however even 100,000 or 1,000,000 is acceptable. The amounts that are not acceptable are 1 000,000.00 or 1.000.000.00 or 1,000,000,00 or 1,000,000,0000"
matches = re.findall(r'(?<!\S)[1-9]\d{0,2}(?:,\d{3})*(?:\.\d+)?(?!\S)', inp)
print(matches)

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

['1,000,000.00', '100,000', '1,000,000', '1']

В качестве примечания о том, почему 1 появляется в результате выше, нет очевидного способа узнать, что стандартное число 1 на самом деле является частью сломанного числа одного миллиона.

1 голос
/ 13 июля 2020

Другой вариант - исключить, что есть только нули перед первой запятой, используя отрицательный просмотр вперед, и сопоставить хотя бы одну запятую после значения, поскольку желаемый результат: 1,000,000.00 100,000 1,000,000

(?<!\S)(?!0+\,)\d{1,3}(?:,\d{3})+(?:\.\d+)?(?!\S)

Пояснение

  • (?<!\S) Утверждение границы пробела слева
  • (?!0+\,) Утверждение не только нулей перед первой запятой
  • \d{1,3} Соответствие 1-3 цифрам
  • (?:,\d{3})+ Повторить 1+ раз, сопоставив запятую и 1-3 цифры
  • (?:\.\d+)? При необходимости сопоставить точку и 1+ цифр
  • (?!\S) Утвердить границу пробелов справа

Regex demo | Python демонстрация

Пример

import re
 
input = "The net value is 1,000,000.00 however even 100,000 or 1,000,000 is acceptable. The amounts that are not acceptable are 1 000,000.00 or 1.000.000.00 or 1,000,000,00 or 1,000,000,0000"
regex = r"(?<!\S)(?!0+\,)\d{1,3}(?:,\d{3})+(?:\.\d+)?(?!\S)"
 
print(re.findall(regex, input))

Выход

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