如何仅从值$ 1,632.50(BigQuery)中提取数字

时间:2019-01-21 20:40:45

标签: python sql regex google-bigquery

我只想提取小数点前的数字。

例如-> $ 1,632.50

我希望它返回1632。

如果当前值与逗号相关联,则我拥有的当前正则表达式( r'[0-9] +')无法获取正确的值。

示例-> $ 1,632.50,它返回1

但---> $ 500.00则返回500 在这种情况下效果很好

我是regex的新手。感谢您的帮助

PS:我目前正在使用 Bigquery 和 我只有REGEX_EXTRACT和REGEX_REPLACE可以使用。

这里的大多数解决方案都可以在普通的python脚本上运行,但我仍然无法在BigQuery上运行

7 个答案:

答案 0 :(得分:3)

以下是用于BigQuery标准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  

答案 1 :(得分:1)

您的正则表达式匹配数字的第一个。它以逗号停止。似乎只有一个正则表达式很难做到这一点。

因此搜索数字逗号,然后使用# A tibble: 9 x 2 Date n <date> <dbl> 1 2019-01-01 2 2 2019-01-02 5 3 2019-01-03 0 4 2019-01-04 0 5 2019-01-05 1 6 2019-01-06 0 7 2019-01-07 0 8 2019-01-08 1 9 2019-01-09 5 用逗号替换逗号,将其转换为整数:

str.replace

(不适用于import re s = "$1,632.50" result = int(re.search("([\d,]+)",s).group(1).replace(",","")) ,但是您可以使用其他技巧,例如,在开始确定{{之后是0之前,将$.50替换为$ 1}})

答案 2 :(得分:0)

在没有regexp的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并无多大区别,但从技术上讲,它是使用“仅”正则表达式来实现的一种方法。

答案 3 :(得分:0)

我认为最简单的解决方案就是使用re.sub

示例:

import re

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

这将所有非数字和.替换为空,仅保留数字,包括小数。

答案 4 :(得分:0)

这似乎效果很好: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程序包似乎不支持重复的子组捕获。在这种情况下,您可能应该使用字符串替换。

破坏正则表达式:

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]),如示例代码中所示。

答案 5 :(得分:0)

您的正则表达式[0-9]+匹配数字的1+倍,而不匹配逗号。它还没有考虑美元符号。

您可能要做的是匹配一个美元符号,捕获一组1个以上的数字和一个与逗号和1个以上的数字匹配的可选部分。然后,从该组中用一个空字符串替换逗号。

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

说明

  • \$匹配$
  • (捕获组
    • \d+匹配1个以上的数字
    • (?:,\d+)?匹配逗号和1个以上数字的可选捕获组
  • )关闭捕获组

Regex demo

答案 6 :(得分:0)

在BigQuery中,您可以结合使用以下两个功能:

select regexp_replace(regexp_extract(str, '[^.]+'), '[^0-9]', '')
from (select '$1,632.50' as str) x