REGEX 提取金额不带货币
Posted
技术标签:
【中文标题】REGEX 提取金额不带货币【英文标题】:REGEX Extract Amount Without Currency 【发布时间】:2020-12-20 18:40:30 【问题描述】:SELECT
ocr_text,
bucket,
REGEXP_EXTRACT('-?[0-9]+(\.[0-9]+)?', ocr_text)
FROM temp
我正在尝试从不存在货币的字符串中提取金额。任何没有小数的数字都不应该匹配。假设逗号遵循正确的规则(在数百个标记处),则应允许使用逗号
56 no (missing decimals)
56.45 yes
120 no (missing decimals)
120.00 yes
1200.00 yes
1,200.00 yes
1,200 no (missing decimals)
1200 no (missing decimals)
134.5 no (decimal not followed by 2 digits)
23,00.00 no (invalid comma location)
我是 REGEX 的菜鸟,所以我知道我的上述陈述已经不符合我列出的标准。但是,我已经在我的REGEX_EXTRACT
行上遇到了错误(INVALID_FUNCTION_ARGUMENT) premature end of char-class
有人能指出我正确的方向吗?如何解决我当前的问题?如何修改以正确合并列出的其他标准?
【问题讨论】:
公平地说,世界上只有大约五个人懂正则表达式。不要出汗。 @CaptainKenpachi Wiktor Stribiżew 可能被认为是五个:-)
之一
是的,他来自世界上许多天才的地方。
【参考方案1】:
以下是带有两位小数和可选的千位逗号分隔符的正/负数的一般正则表达式模式:
(?<!\S)(?:-?[0-9]1,3(,[0-9]3)*(\.[0-9]2)|-?[0-9]+(\.[0-9]2))(?!\S)
Demo
您更新后的查询:
SELECT
ocr_text,
bucket,
REGEXP_EXTRACT(ocr_text, '(?<!\S)(?:-?[0-9]1,3(,[0-9]3)*(\.[0-9]2)|-?[0-9]+(\.[0-9]2))(?!\S)')
FROM temp;
从我阅读的 Presto 文档来看,它应该支持 Java 的正则表达式语法。如果环视不起作用,您可以试试这个版本:
SELECT
ocr_text,
bucket,
REGEXP_EXTRACT(ocr_text, '(\s|^)(?:-?[0-9]1,3(,[0-9]3)*(\.[0-9]2)|-?[0-9]+(\.[0-9]2))(\s|$)')
FROM temp;
【讨论】:
@urdearboy 请重新加载页面并尝试我的查询的第二个版本。这应该对你有用,没有问题。 与您的更新版本相同的问题 :(。+1 from new none-the-less for your time @urdearboy 发现了你的其他问题。REGEXP_EXTRACT
的语法是输入first,正则表达式模式second。再试一次,看看它现在是否正常工作。
仅作记录,您能否检查两个版本并在此处评论哪些版本适合您?
他们实际上都有效。正则表达式和列的 Ran 查询相等【参考方案2】:
REGEXP_EXTRACT('^[-]?(\d*.\d*)', ocr_text)
模式:^[-]?(\d*\.\d*)
解释:
^
- 行首
[-]?
- 带或不带负破折号 (-)
\d*
- 0 位或更多位
\.
- 小数(转义,因为在正则表达式中小数被视为特殊字符)
\d*
- 0 位或更多位(小数部分);
$
- 行尾。
额外提示:test your regex 有在线有用的工具!
【讨论】:
【参考方案3】:下面的代码可以像所有数字一样提取值,但它可以捕获所有值,仅特定于某些字母它不能很好地工作。任何人,请好好建议。
-?\d+\.?\d*
我已经使用 Regex 完成了 NLP 方面的工作。
【讨论】:
这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review以上是关于REGEX 提取金额不带货币的主要内容,如果未能解决你的问题,请参考以下文章