【问题标题】:regex to remove comma between double quotes notepad++正则表达式删除双引号之间的逗号记事本++
【发布时间】:2014-06-06 00:03:18
【问题描述】:

我正在尝试从 notepad++ 中的 csv 文件中删除双引号内的逗号,这就是我所拥有的:

1070,17,2,GN3-670,"COLLAR B, M STAY","2,606.45"

我需要这个:

1070,17,2,GN3-670,"COLLAR B M STAY","2606.45"

我正在尝试使用带有 reg exp 的记事本查找/替换选项。图案。 我尝试了各种组合,但没有成功:(该文件包含 100 万行。

今天之后,我不再确定一个简单的正则表达式是否可以做到?也许我应该使用脚本...python?

【问题讨论】:

  • 双引号之间可以有多个逗号吗?

标签: regex notepad++


【解决方案1】:

mrki,这会做你想要的(在 N++ 中测试):

搜索:("[^",]+),([^"]+")

替换:$1$2 或 \1\2

这是如何工作的?第一个括号将字符串的开头捕获到(但不包括)逗号到第 1 组。第二个括号将逗号之后的字符串结尾捕获到第 2 组。替换用第 1 组的串联替换字符串和第 2 组。

更详细地说:在第一个括号中,我们匹配开始的双引号,然后匹配任意数量的非逗号字符。这就是[^,]+ 的含义。在第二个括号中,我们将任意数量的非双引号字符与[^"]+ 匹配,然后是右双引号。

【讨论】:

  • @mrki 仅供参考,请让我知道这是否适合您。
  • 为了更安全,我会使用("[^",]+),([^"]*"),因为双引号需要注意before和after逗号
  • @mrki 这可能是因为您需要单击 N++ 中替换选项卡左下方的“正则表达式”复选框。 :)
  • @HamZa 不错的截图。 :)
【解决方案2】:

试试下面的

import re

print re.sub(',(?=[^"]*"[^"]*(?:"[^"]*"[^"]*)*$)',"",string)

这将删除引号之间的逗号

【讨论】:

    【解决方案3】:

    只是对@zx81 出色解决方案的更新。 假设您在引号之间有 2 个逗号

    那么正则表达式搜索必须修改如下:

    ("[^",]+),([^",]+),([^"]+")
    

    替换需要修改为

    $1$2$3
    

    所以根据逗号的数量来修改它。

    我尝试探索递归正则表达式是否可行,但目前似乎还不可能

    【讨论】:

    【解决方案4】:

    对于具有多个“双引号内的逗号”实例的行,我可以想到以下 perl 脚本 - 您需要有一个没有这种实例的标题行,以便您知道应该有多少逗号分隔的字段是。

    #! /usr/bin/perl -w
    
    use strict;
    
    my $n_fields = "";
    while (<>) {
        s/\s+$//;
        if (/^\#/) { # header line
            my @t = split(/,/);
            $n_fields = scalar(@t); # total number of fields
        } else { # actual data
            my $n_commas = $_ =~s/,/,/g; # total number of commas
            foreach my $i (0 .. $n_commas - $n_fields) { # iterate ($n_commas - $n_fields + 1) times
                s/(\"[^",]+),([^"]+\")/$1\\x2c$2/g; # single replacement per previous answers
            }
            s/\"//g; # removal of double quotes (if you want)
        }
        print "$_\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多