Как записывать числа с помощью регулярного выражения в Python? - PullRequest
0 голосов
/ 13 июля 2020

Учитывая входную строку букв и цифр, я пытаюсь захватить числа, которые соответствуют заданному формату c.

Входной образец выглядит следующим образом:

Здравствуйте моя net ценность составляет 1 000 000,00, и мне она нравится

Ожидаемый результат: 1 000 000,00

def detect_numbers(input_numbers_string):

number_format_pattern_map = {
        'us_start_with_decimal_regex': '(\.{1}\d+)$',
        'us_decimal_and_comma_regex': '\d{1,3}(,{1}\d{3})*(\.{1}\d+){0,1}$'
    }
    
fuzzy_matched_substrings = []
fuzzy_match_locations = []
fuzzy_changes = []
matched_formats = []

for numbers in number_format_pattern_map:
    number_pattern_string = number_format_pattern_map[numbers]
    r = regex.compile('(?e)(%s){e<=2}' % number_pattern_string)
    fuzzy_matches = r.finditer(query_string)
    for matches in fuzzy_matches:
         print(matches)

if __name__ == '__main__':
    query_string = 'hello my net worth is 1,000,000.00 and i like it'
    updated_query_string = detect_numbers(query_string)
    print(updated_query_string)

Я получаю ожидаемый результат, когда передаю «1,000,000,00» в качестве входной строки. Однако, когда я передаю «привет, моя net стоимость составляет 1 000 000,00, и мне она нравится», я получаю следующий результат:

regex.Regex ('(? E) ((\. {1} \ d +) $) {e <= 2} ', flags = regex.V0) regex.Regex ('(? e) (\ d {1,3} (, {1} \ d {3}) <em>(\. {1} \ d +) {0,1} $) {e < = 2} ', flags = regex.V0) regex.Regex ('(? e) ((, {1} \ d +) $) {e <= 2}', flags = regex.V0) regex.Regex ('(? e) (\ d {1,3} (\. {1} \ d {3}) </em> (, {1} \ d +) {0,1} $) {e < = 2} ', flags = regex.V0)

Это захватывает только его и t, тогда как он должен захватывать 1,000,000.00 и подобные подстроки. Любая помощь или советы приветствуются.

1 Ответ

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

Шаблон

((?:\d{1,3},)*\d{1,3}\.\d{2})

Пояснение

  • ( Запуск основной группы захвата
    • (?: Группа без захвата (исключает эту группу из результатов сопоставления)
      • \d{1,3}, От одной до трех цифр, за которыми следует запятая.
    • )* Конец не- группа захвата, * соответствует нулю или более вхождений. Это не обязательно, значение может содержать запятую (больше 1000) или быть меньше 1000 (без запятой).
    • \d{1,3} Охватывает значения от 0 до 999 (обязательно)
    • \.\d{2} Соответствует от .00 до .99
  • ) Конечная основная группа захвата
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...