Регулярное выражение Python - извлечение шаблона с плавающей точкой - PullRequest
2 голосов
/ 16 марта 2019

Я пытаюсь извлечь определенный «float» из строки, он содержит несколько форматированных «integer», «float» и даты. О конкретном «поплавке», о котором идет речь, руководствуется некий стандартизированный текст.

Образец строки

my_string = """03/14/2019 07:07 AM
?Soles in mDm : 2864.35⬇
?BTC purchase in mdm: 11,202,782.0⬇
"""

Мне удалось извлечь нужный шаблон с плавающей точкой для 2864.35 из my_string, но если этот конкретный тип с плавающей точкой изменится в шаблоне или появится другой тип с плавающей точкой того же формата, мой сценарий не вернет желаемый результат

regex = r"(\d+\.\d+)"
matches = re.findall(regex, my_string)
for match in matches:
    print(match)
  • Возможно усечение нужного числа с плавающей точкой из-за несовместимого числового форматирования
  • Может быть напечатано два числа с плавающей точкой, потому что числовой шаблон нежелательного числа с плавающей точкой слишком похож, чтобы быть отфильтрованным текущим регулярным выражением regex

Желаемый возврат из регулярного выражения regex

  • float с гибкой целой частью, иногда запятая опускается, т.е. 45000,50 другие времена 45,000,50
  • уникальный идентификатор строки: Soles это может быть верхний / нижний регистр
  • идентификатор строки: префикс float :
  • он должен возвращать только один float

Некоторые отклонения искомого числа с плавающей запятой только во второй строке

Ниже вы видите три примера одной и той же строки, вторая строка в my_string. Регулярное выражение должно иметь возможность возвращать только строку номер два, несмотря на любые изменения, такие как подошвы или подошвы

  • oСоли в мДм: 2864,35⬇
  • подошвы МДМ: 2 864,35
  • Подошвы в MDM: 2 864,355

Любая помощь в редактировании или переписывании текущего регулярного выражения regex приветствуется

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

РЕДАКТИРОВАТЬ - Хммм ... Если это должно следовать soles, то, надеюсь, это поможет

Попробуйте это, если моя консоль не может принимать дополнительные символы, но на основеВаш ввод:

>>> my_string = """03/14/2019 07:07 AM
Soles in mDm : 2864.35
BTC purchase in mdm: 11,202,782.0
Soles in mDm : 2864.35
soles MDM: 2,864.35
Soles in mdm :2,864.355
"""


>>> re.findall('(?i)soles[\S\s]*?([\d]+[\d,]*\.[\d]+)', my_string)

#Output
['2864.35', '2864.35', '2,864.35', '2,864.355']



>>> re.findall('[S|s]oles[\S\s]*?([\d]+[\d,]*\.[\d]+)', my_string)

#Output
['2864.35', '2864.35', '2,864.35', '2,864.355']
0 голосов
/ 16 марта 2019

Если вы хотите сопоставить несколько экземпляров, просто добавьте флаг g, иначе он будет соответствовать только одному экземпляру. REGEX

(?<=:)\s?([\d,]*\.\d+)

С Python,

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(?<=:)\s?([\d,]*\.\d+)"

test_str = ("\n"
    "    ?Soles in mDm : 2864.35⬇\n"
    "    soles MDM: 2,864.35\n"
    "    Soles in mdm :2,864.355\n")

matches = re.search(regex, test_str, re.IGNORECASE)

if matches:
    print ("Match was found at {start}-{end}: {match}".format(start = matches.start(), end = matches.end(), match = matches.group()))

    for groupNum in range(0, len(matches.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = matches.start(groupNum), end = matches.end(groupNum), group = matches.group(groupNum)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...