在以下价格列表中,我正在尝试找出如何归一化/提取仅数字的方法。
INPUT DESIRED_OUTPUT
CA$1399.00 1399.00
$1399.11 1399.11
$1,399.22< 1399.22
Z$1 399.33 1399.33
$1399.44# 1399.44
C$ 1399.55 1399.55
1,399.66 1399.66
1399.77 1399.77
,1399.88 1399.88
25 1399.88 1399.88
399.99 399.99
88.88 99.99 99.99 (if >2 matches on one line, only the last one matters)
.1399.88 DO NOT MATCH (not a price; too many ".")
666.000 DO NOT MATCH (not a price: too many 0's)
我觉得最好从它们的共同之处开始:
- 价格始终包含
.NN
,但不包括.NNN
进一步检查后,其他规则变得明显起来:
.NN
必须由一个或多个数字digits
前缀。NNN.NN
可以由,
,或简单的
digit
前缀,但不能有其他东西。- 在
*N.NN
之前的任何跟随.NN
的内容标志着匹配的结尾。 - 最后,正则表达式需要考虑像
1,399.66
(1399.66
)这样的逗号,以确定它是否是价格,然后剥离它们。例如1, 399.66
并不等于1399.66
:它应该是399.66
。
我正在寻找使用sed
、grep
和awk
作为便携式和高效解决方案。我该如何处理这个问题?
我找到了一个类似的问题,但我不知道如何使用sed
尝试以下正则表达式:
^\d+(,\d{1,2})?$
编辑:是的,我的输入格式可能有点奇怪,因为它是爬取页面拼接的结果。
说明:本段内容提到了输入格式问题,因为其来源是多个爬取页面的拼接。
。您的输入格式非常尴尬 -
Z$1 399.33应该匹配空格前面的数字,但是
25 1399.88`不应该匹配空格前面的数字?为什么 - 可以用什么规则编码这种区别?程序和数据的其余部分是什么样子的 - 您可以进行清理运行或多次运行吗? - TessellatingHeckler.1399.98
不应匹配,而1 399.98
对应于1399.98
。但是对于.1 399.98
呢?空格是否很重要,以便匹配并且价格为399.98
?我认为要求应该是通过提取.1
作为令牌来解决此问题,其中尾随空格终止小数部分。下一个数字令牌是399.98
:好价钱。 - Kaz.1 399.98
单独站着是1399.98
,但在其他情况下,这样宽松的规则可能会导致误报,这就是为什么我一开始拒绝了.1399.88
。我不确定如何解决这个问题,但.1 399.98
也相当不太可能出现。@Kaz curl。我使用curl。 - octosquidopus\d\d\.((\d){3}(, ))+\d+
? 它似乎更容易倒着运行。 - TessellatingHeckler