Как извлечь только числа из значения $ 1 632,50 (BigQuery) - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы извлечь только цифры перед десятичной точкой.

например -> $ 1 632,50

Я хотел бы вернуть 1632.

текущее регулярное выражение Ihave ( r '[0-9] +' ) не выбирает правильное значение, если с этим значением связана запятая.

пример -> 1 632,50 $ возвращает 1

но для ---> $ 500.00 возвращается 500. В этом случае работает нормально

Я новичок в регулярных выражениях.Любая помощь приветствуется

PS: в настоящее время я использую Bigquery , и у меня есть только REGEX_EXTRACT и REGEX_REPLACE для работы.

Большинство решений здесь работают на обычном скрипте Python, но я все еще не могу заставить его работать на BigQuery

Ответы [ 7 ]

0 голосов
/ 22 января 2019

В BigQuery вы можете объединить две функции:

select regexp_replace(regexp_extract(str, '[^.]+'), '[^0-9]', '')
from (select '$1,632.50' as str) x
0 голосов
/ 22 января 2019

Ниже для BigQuery Standard SQL

REGEXP_REPLACE(str, r'\..*|[^0-9]', '')   

Как видите, только один REGEXP_REPLACE выполняет работу

Вы можете проверить, поиграть с ним, используя фиктивные данные, как показано ниже

#standardSQL
WITH t AS (
  SELECT '$1,632.50' AS str UNION ALL
  SELECT  '$500.00'
)
SELECT 
  str, 
  REGEXP_REPLACE(str, r'\..*|[^0-9]', '') AS extracted_number
FROM t 

с результатом

Row str         extracted_number     
1   $1,632.50   1632     
2   $500.00     500  
0 голосов
/ 22 января 2019

Ваше регулярное выражение [0-9]+ соответствует 1+ раз цифре и не будет соответствовать запятой. Также не учитывается знак доллара.

Что вы можете сделать, это сопоставить знак доллара, захватить в группе 1+ цифр и необязательную часть, которая соответствует запятой и 1+ цифрам. Затем из этой группы замените запятую пустой строкой.

\$(\d+(?:,\d+)?)

Объяснение

  • \$ Матч $
  • ( Захватывающая группа
    • \d+ Совпадение 1+ цифр
    • (?:,\d+)? Дополнительная группа захвата, которая соответствует запятой и 1+ цифрам
  • ) Закрыть Группа захвата

Regex demo

0 голосов
/ 21 января 2019

Это, кажется, работает очень хорошо: r'(\d{,3})?[.,]?(\d{3})?'. Тестирование:

import re
pattern = r'(\d{,3})?[.,]?(\d{3})?'
tests = ['1,234.50',
         '456.7',
         '12']
for t in tests:
    print(''.join([g for g in re.match(pattern, t).groups() if g is not None]))
# 1234
# 456
# 12

К сожалению, вы столкнулись с проблемой повторных группировок. Похоже, что пакет re не поддерживает повторный захват подгрупп. В этих случаях вам, вероятно, следует использовать строку replace.

Разбиваем регулярное выражение:

pattern = """ (          # begin capture group
               \d{,3}    # up to three digits
              )          # end capture group
              ?          # zero or one of these first groups of digits
              [.,]?      # zero or one period or comma (not captured)
              (          # begin capture group inside of the non-capture group
               \d{3}     # exactly three digits
              )          # end capture group
              ?          # zero or one of these
          """

Возможно, вы могли бы немного упростить это, но главное, что вы захватываете каждую группу из трех цифр (обрабатывает первую по-разному, потому что она может быть до трех), разделенных необязательными запятыми. Чтобы собрать их все вместе, просто используйте ''.join([g for g in re.match(pattern, my_string).groups() if g is not None]), как в примере кода.

0 голосов
/ 21 января 2019

Я думаю, что самое простое решение - просто использовать re.sub.

Пример:

import re

result = re.sub(r'[^\d.]', '', '$1,234.56')

Это заменяет все не-числа и . ничем, оставляятолько цифры, включая десятичную.

0 голосов
/ 21 января 2019

Один из способов сделать это в Python без регулярных выражений - извлечь часть строки, которая находится между знаком доллара и десятичной дробью, а затем использовать replace, чтобы удалить все запятые, найденные внутри.

s = "My price is: $1,632.50"
extracted = s[s.find('$')+1:s.find('.')].replace(',', '')
print(extracted)

Вот то же самое с регулярным выражением:

# Look for the first dollar sign, followed by any mix of digits and 
# commas, and stop when you've found (if any) character after that
# which isn't a comma or digit.  So both "$1,234.50!" and "$1,234!"
# for example should give back "1234".
result = re.search("(\$)([\d,]+)([^,\d]*)", s)
print(re.sub(',', '', result.group(2)))

re.sub здесь не сильно отличается от использования строки .replace, но технически это способ сделать это, используя "только" регулярные выражения.

0 голосов
/ 21 января 2019

Ваше регулярное выражение соответствует первой группе цифр.Он останавливается на запятой.Кажется трудным сделать это только с одним регулярным выражением.

Поэтому найдите цифры и запятую, затем замените запятую ничем, используя str.replace, преобразуйте в целое число:

import re

s = "$1,632.50"

result = int(re.search("([\d,]+)",s).group(1).replace(",",""))

(не работает для $.50, но вы можете использовать другие приемы, например, заменить $ на $0, прежде чем начинать проверять наличие 0 после $)

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