Сумма в долларах США, тысячи разделяются запятыми - PullRequest
0 голосов
/ 12 октября 2018

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

Полученная сумма представляет собой строку, не опознанную как сумма из-за запятых.Он также не работает для небольших сумм, меньших $1 (например, 0.89).Нет ведущего $.Любая помощь очень ценится.

Вот что у меня есть:

df['Amount']=df['description'].str.extract('(\d{1,3}?(\,\d{3})*\.\d{2})')

Вот строка, которая должна быть проанализирована:

000000000463 NYC DOF OPA CONCENTRATION ACCT. *00029265 07/01/2013 AP5378 1,107,844.38 Ven000000000463 Vch:00029265

Я пытаюсьизвлечь сумму 1,107,844.38 в отдельном столбце объекта dataframe.У меня нет никаких строк, которые должны быть отклонены.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Учитывая пример строки:

"000000000463 NYC DOF OPA CONCENTRATION ACCT. *00029265 07/01/2013 AP5378 1,107,844.38 Ven000000000463 Vch:00029265"

Вот что я придумал:

match = re.search(r"(?P<amount>\$?(?:\d+,)*\d+\.\d+)", subject)
if match:
    result = match.group("amount")  # result will be "1,107,844.38"
else:
    result = ""

, чтобы извлечь сумму.Он также обрабатывает небольшие суммы, такие как 0.38, суммы, у которых нет разделительных запятых, таких как 123456789.38, и суммы могут предшествовать или не начинаться со знака доллара $.

Regex details

(?<amount>\$?(?:\d+,)*\d+\.\d+)  Match the regular expression below and capture its match into backreference with name “amount” 
\$?                              Match the character “$” literally
?                                Between zero and one times, as many times as possible, giving back as needed (greedy) 
(?:\d+,)*                        Match the regular expression below 
*                                Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
\d+                              Match a single digit 0..9 
+                                Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
,                                Match the character “,” literally 
\d+                              Match a single digit 0..9 
+                                Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\.                               Match the character “.” literally 
\d+                              Match a single digit 0..9 
+                                Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
0 голосов
/ 12 октября 2018

Вы можете попробовать регулярное выражение, например

rx = r"\b(?<!/)(\d{1,3}(?:,\d{3})*(?:\.\d{2})?)\b(?!/)"
df['Amount']=df['description'].str.extract(rx)

См. Демо регулярное выражение

Подробно

  • \b - граница слова
  • (?<!/) - нет / непосредственно слева от текущего местоположения (чтобы избежать совпадения значений времени и даты)
  • \d{1,3} - от 1 до 3цифры
  • (?:,\d{3})* - 0+ повторений , и 3 цифры
  • (?:\.\d{2})? - необязательно . и 2 цифры
  • \b - aграница слова
  • (?!/) - нет / непосредственно справа от текущего местоположения (чтобы избежать совпадения значений времени и даты)
...