Regex 从字符串字段中提取数字,包括十进制(Postgres 9.5)
假设我有一个字段:Regex 从字符串字段中提取数字,包括十进制(Postgres 9.5),regex,postgresql,Regex,Postgresql,假设我有一个字段: product_strength 10MG/ML 0.25MG 25MG 0.125MG 如何仅提取“数字”部分,然后转换为数字?我可以做到这一点:regexp\u replace(产品强度,(\D |!\),“,”g”)::结果为数值\u数值 但问题是它实际上并不能解释小数点。换言之,这将返回 product_strength result_numeric 10MG/ML 10 0.25MG 25 25MG
product_strength
10MG/ML
0.25MG
25MG
0.125MG
如何仅提取“数字”部分,然后转换为数字?我可以做到这一点:regexp\u replace(产品强度,(\D |!\),“,”g”)::结果为数值\u数值
但问题是它实际上并不能解释小数点。换言之,这将返回
product_strength result_numeric
10MG/ML 10
0.25MG 25
25MG 25
0.125MG 125
但我想回去
product_strength result_numeric
10MG/ML 10
0.25MG 0.25
25MG 25
0.125MG 0.125
尝试使用正则表达式匹配数字
\d+\.?\d*
编辑:正如“布尔类型”所说,如果你也需要负数,你可以添加一个可选的负号,并使用
\-?\d+\.?\d*
尝试使用正则表达式匹配数字
\d+\.?\d*
编辑:正如“布尔类型”所说,如果你也需要负数,你可以添加一个可选的负号,并使用
\-?\d+\.?\d*
我将使用regexp_匹配:
select (regexp_matches(product_strength, '[0-9]+\.?[0-9]*'))[1]::numeric
from the_table
regexp\u matches()返回所有匹配字符串的数组,这就是为什么需要
[1]
。我将使用regexp\u匹配:
select (regexp_matches(product_strength, '[0-9]+\.?[0-9]*'))[1]::numeric
from the_table
regexp\u matches()返回所有匹配字符串的数组,这就是为什么需要
[1]
。此模式匹配空字符串'
@a\u horse\u和\u no\u name这不匹配数字的所有实例。例如,12a15b
=>{12}
。我需要的是{12,15}
。我尝试了g
修饰符:(regexp\u匹配(产品强度,[0-9]+\?[0-9]*','g'))
但这不起作用。此模式匹配空字符串”
@a\u horse\u和\u no\u名称。此模式不匹配数字的所有实例。例如,12a15b
=>{12}
。我需要的是{12,15}
。我尝试了g
修饰符:(regexp\u匹配(产品强度,[0-9]+\.?[0-9]*,'g'))
但这不起作用我的实际用例是在sqlalchemy中,我有:sa.cast(sa.func.regexp\u匹配(col,'\d+\.?\d*')),sa.Numeric)
。如何访问sa.func.regexp\u matches返回的数组的第一个元素?我尝试了sa.cast(sa.func.regexp\u匹配(col,“\d+\?\d*”)[0],sa.Numeric)
,但这并不管用,我实际上能够使用子字符串
函数。所以这对我来说很有效:substring(product\u-strength,'\d+\.?\d*)::numeric
或在sqlalchemy中:sa.cast(sa.func.substring(col,'\d+\.?\d*),sa.numeric)
这个解决方案考虑了可能的负数:-?\d+\.\d*
。我的实际用例是在sqlalchemy中,我有:sa.cast(sa.func.regexp)(列“\d+\?\d*”),sa.Numeric)
。如何访问由sa.func.regexp\u匹配项返回的数组的第一个元素
?我尝试了sa.cast(sa.func.regexp\u匹配项(列“\d+\?\d*”)[0],sa.Numeric)
但这并不管用啊,不管怎样,我实际上能够使用子字符串
函数。因此这对我来说很管用:子字符串(产品强度,'\d+\.?\d*')::numeric
或在sqlalchemy中:sa.cast(sa.func.substring(col,'\d+\.\d*'),sa.numeric)
此解决方案考虑了可能的负数:\-?\d+\.?\d*
。