Php Regex大师!这里';这是一个难题:混合了数千个分隔符和csv';s

Php Regex大师!这里';这是一个难题:混合了数千个分隔符和csv';s,php,regex,Php,Regex,我有一根像 "labour 18909, liberals 12,365,conservatives 14,720" …我想要一个正则表达式,它可以去掉任何数千个分隔符,这样我就可以轻松地提取数字。甚至是一个正则表达式,它可以给我一个整洁的数组,比如: (labour => 18909, liberals => 12365, conservatives => 14720) 哦,我希望我有时间弄清楚正则表达式!也许我会买一本作为厕纸,嗯。您可以搜索并替换为sed: >

我有一根像

"labour 18909, liberals 12,365,conservatives 14,720"
…我想要一个正则表达式,它可以去掉任何数千个分隔符,这样我就可以轻松地提取数字。甚至是一个正则表达式,它可以给我一个整洁的数组,比如:

(labour => 18909, liberals => 12365, conservatives => 14720)

哦,我希望我有时间弄清楚正则表达式!也许我会买一本作为厕纸,嗯。

您可以搜索并替换为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位替换它们。

您可以进行搜索并替换,例如使用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位替换它们。

好的,使用以下正则表达式可以将数字与其他数字分开:

labour\s*([\d,.]+),\s*liberals\s*([\d,.]+),\s*conservatives\s*([\d,.]+)
毕竟,一个数字显然在一个不再有数字跟随的点结束。然后可以继续从值中删除逗号

PowerShell演示(有点精简,抱歉):

PS Home:\>$s-match'labour\s*(?[\d,.]+),\s*liberals\s*(?[\d,.]+),\s*保守派\s*(?[\d,.]+)'|
出空
PS Home:\>“劳工:{0}`nLiberals:{1}`nConservatives:{2}”-f`
($Matches['labour'],$Matches['liberals'],$Matches['conservators']|
foreach{$\替换','})
劳工:18909
自由派:12365
保守党:14720

好的,使用以下正则表达式可以将数字与其他数字分开:

labour\s*([\d,.]+),\s*liberals\s*([\d,.]+),\s*conservatives\s*([\d,.]+)
毕竟,一个数字显然在一个不再有数字跟随的点结束。然后可以继续从值中删除逗号

PowerShell演示(有点精简,抱歉):

PS Home:\>$s-match'labour\s*(?[\d,.]+),\s*liberals\s*(?[\d,.]+),\s*保守派\s*(?[\d,.]+)'|
出空
PS Home:\>“劳工:{0}`nLiberals:{1}`nConservatives:{2}”-f`
($Matches['labour'],$Matches['liberals'],$Matches['conservators']|
foreach{$\替换','})
劳工:18909
自由派:12365
保守党:14720

您想要的似乎是仅在逗号被数字包围时删除它们。 抱歉,我不知道PHP正则表达式语法的细节,但是下面是几个更抽象的示例

str.replace("(\d+),(\d+)", "$1$2")
s/([0-9]+),([0-9]+)/\1\2/g

这些将得到所有正确的数字,但也会得到一些不正确的数字,例如“2,41,11”

您想要的似乎是删除逗号,如果它们被数字包围。 抱歉,我不知道PHP正则表达式语法的细节,但是下面是几个更抽象的示例

str.replace("(\d+),(\d+)", "$1$2")
s/([0-9]+),([0-9]+)/\1\2/g

这些将得到所有正确的数字,但也会得到一些不正确的数字,例如“2,41,11”

两行。还将获得独立候选人:

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
)
*/

两个班轮。还将获得独立候选人:

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
)
*/

在以前的生活中,我做了很多像这样的数据处理,除了有上亿条记录需要几天才能处理

我总是发现遵循这个策略是明智的

  • 知道你的数据吗

    。客户总是说他们的数据是完美的、格式良好的和正确的

    。它总是一堆冒着蒸汽的渡渡鸟粪便

  • 定义数据的规则,有时更容易定义数据不是什么

  • 在和编辑器中使用正则表达式甚至宏搜索和替换来查找数据违反规则的位置

  • 修复、请求新数据集、丢弃数据

  • 重复步骤3和4,直到数据干净为止

  • 现在想想数据的格式,通过对数据进行一些简单的操作,可以简化正则表达式匹配吗

    。例如,在您的案例中,将逗号后跟多个空格替换为单个逗号

    。然后去掉每个被数字包围的逗号

    。去除多个空白(保留单个空白)

    。在字符和alpha字符之前删除空白

  • 定义此新数据集的规则并确保其干净

    。这现在可以包括对数值数据的范围检查

    。更复杂的规则

  • 现在你的数据看起来像“工党18909,自由党12365,保守党14720”

  • 为这个新数据集构建导入工具(简单位)

  • 确保你有一个1..9的可重复系统,因为客户需要一个简单的更改,或者只是他们现在需要的额外一点


  • 在以前的生活中,我做了很多像这样的数据处理,除了有上亿条记录需要几天才能处理

    我总是发现遵循这个策略是明智的

  • 知道你的数据吗

    。客户总是说他们的数据是完美的、格式良好的和正确的

    。它总是一堆冒着蒸汽的渡渡鸟粪便

  • 定义数据的规则,有时更容易定义数据不是什么

  • 在和编辑器中使用正则表达式甚至宏搜索和替换来查找数据违反规则的位置

  • 修复、请求新数据集、丢弃数据

  • 重复步骤3和4,直到数据干净为止

  • 现在想想数据的格式,通过对数据进行一些简单的操作,可以简化正则表达式匹配吗

    。例如,在您的案例中,将逗号后跟多个空格替换为单个逗号

    。然后去掉每个被数字包围的逗号

    。去除多个空白(保留单个空白)

    。在字符和alpha字符之前删除空白

  • 定义此新数据集的规则并确保其干净

    。这现在可以包括对数值数据的范围检查

    。更复杂的规则

  • 现在你的数据看起来像“工党18909,自由党12365,保守党14720”