我有一个像......这样的字符串。
"labour 18909, liberals 12,365,conservatives 14,720"
...而且我想要一个可以摆脱任何数千个分隔符的正则表达式,这样我就可以轻松地提取出数字。或者甚至是正则表达式,它可以给我一个整洁的数组,如:
(labour => 18909, liberals => 12365, conservatives => 14720)
哦,我希望我有时间弄清楚正则表达式!也许我会买一本作为厕所书,嗯。
答案 0 :(得分:2)
您可以使用sed:
进行搜索和替换> echo '"labour 18909, liberals 12,365,conservatives 14,720"'
| sed -r -e 's/([0-9]),([0-9]{3})/\1\2/g'
"labour 18909, liberals 12365,conservatives 14720"
我不完全确定PHP语法是什么,但它基本上采用由数字(X),逗号和其他三个数字(Y)组成的模式,并仅用XY位替换它们。
答案 1 :(得分:2)
两衬垫。也将获得独立:
preg_match_all('/([a-zA-Z]+)\s*([\d,]+)(?:,|$)/', $str, $matches);
$totals = array_combine($matches[1], $matches[2]);
/* total:
Array
(
[labour] => 18909
[liberals] => 12,365
[conservatives] => 14,720
)
*/
答案 2 :(得分:1)
如果被数字包围,你想要的只是删除逗号 。 对不起,我不知道PHP正则表达式语法的细节,但是有几个更抽象的例子是
str.replace("(\d+),(\d+)", "$1$2")
s/([0-9]+),([0-9]+)/\1\2/g
这些将得到所有正确的数字,但也会得到一些不太合适的东西,例如“2,41,11”
答案 3 :(得分:0)
好吧,使用以下正则表达式,您可以将数字与其余部分分开:
labour\s*([\d,.]+),\s*liberals\s*([\d,.]+),\s*conservatives\s*([\d,.]+)
毕竟,一个数字显然在不再有数字的位置结束。然后,您可以继续从值中删除逗号。
PowerShell演示(有点浓缩,抱歉):
PS Home:\> $s -match 'labour\s*(?<labour>[\d,.]+),\s*liberals\s*(?<liberals>[\d,.]+),\s*conservatives\s*(?<conservatives>[\d,.]+)' |
Out-Null
PS Home:\> "Labour: {0}`nLiberals: {1}`nConservatives: {2}" -f `
($Matches['labour'],$Matches['liberals'],$Matches['conservatives'] |
foreach { $_ -replace ',' })
Labour: 18909
Liberals: 12365
Conservatives: 14720
答案 4 :(得分:0)
在以前的生活中,我做了很多像这样的数据处理,除了有数百万条记录需要数天处理。
我总是发现遵循这个策略是明智的
了解您的数据
。客户总是会说他们的数据是完美的,格式正确的
。它总是一堆热气腾腾的渡渡鸟便。
定义数据规则,有时更容易定义数据不是
使用正则表达式甚至宏搜索并在内部和编辑器中替换以查找数据违反规则的位置
修复,请求新数据集,丢弃数据
重复步骤3和4直到数据清洁
现在想想数据的格式,可以通过一些简单的数据操作简化正则表达式匹配
。例如,在您的情况下,使用单个逗号替换逗号后跟多个空格
。然后删除数字包围的每个逗号
。剥离多个空白区域(留下单个空白区域)
。之前剥离空白区域和alpha字符
定义此新数据集的规则并确保其清晰
。现在,这可以包括数值数据的范围检查
。更复杂的规则
现在您的数据看起来像“劳工18909,自由主义者12365,保守派14720”
为这个新数据集(简单位)构建导入工具
确保您拥有1..9的可重复系统,因为客户需要进行简单的更改,或者只需要他们现在需要的额外一点点。