Python正则表达式非捕获组

时间:2018-08-05 11:32:20

标签: python regex python-3.x regex-lookarounds

我试图用非捕获组来理解re.split()函数来分割逗号分隔的字符串。

这是我的代码:

 pattern = re.compile(r',(?=(?:"[^"]*")*[^"]*$)')
 text = 'qarcac,"this is, test1",123566'
 results= re.split(pattern, text)
 for r in results:
    print(r.strip())

执行此代码时,结果符合预期。

split1 :qarcac

split2 :“这是test1”

split3 :123566

而如果我在源文本中再添加一个双引号字符串,则无法按预期工作。

text = 'qarcac,"this is, test1","this is, test2", 123566, testdata'

并产生以下输出

split1 :qarcac,“这是test1”

split2 :“这是test2”

split3 :123566

有人可以向我解释一下这是怎么回事,以及这两种情况下非捕获小组的工作方式有何不同?

1 个答案:

答案 0 :(得分:1)

这与(非)捕获组无关。

(?:"[^"]*")*[^"]*$匹配项:

  • "[^"]*"-带引号的字符串(两个引号之间有0个或多个非引号)
  • (?: ... )*-引用的字符串中的0个或更多
  • [^"]*-后跟0个或多个非引号
  • $-后跟字符串的结尾

换句话说,此正则表达式与"foo""bar""baz"otherstuff之类的东西匹配。

在第一个示例中,目标字符串为:

qarcac,"this is, test1",123566
       ^^^^^^^^^^^^^^^^^^^^^^^

我在与上述正则表达式匹配的部分下划线(带引号的部分,后跟无引号的尾部,然后是字符串的结尾)。

在第二个示例中,目标字符串为:

qarcac,"this is, test1","this is, test2", 123566, testdata
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

再次,我强调了与正则表达式匹配的部分。

第一个引用的部分由于逗号不匹配:

"this is, test1","this is, test2"
                X

"foo","bar"不匹配,因为您的正则表达式要求引用的部分必须彼此相邻,例如"foo""bar",而中间没有任何内容。


如果您只是想确保每个匹配的逗号都在引号部分之外(即引号后面是偶数),则可以简单地使用

,(?=[^"]*(?:"[^"]*"[^"]*)*$)

作为您的正则表达式。