Python正则表达式非捕获组

Python正则表达式非捕获组,python,regex,python-3.x,regex-lookarounds,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()) 当我执行这段代码时,结果与预期的一样 拆分1:qarcc 拆分2:“这

我正在尝试理解re.split()函数,该函数使用非捕获组来拆分逗号分隔的字符串

这是我的代码:

 pattern = re.compile(r',(?=(?:"[^"]*")*[^"]*$)')
 text = 'qarcac,"this is, test1",123566'
 results= re.split(pattern, text)
 for r in results:
    print(r.strip())
当我执行这段代码时,结果与预期的一样

拆分1:qarcc

拆分2:“这是测试1”

拆分3:123566

然而,如果我在源文本中再添加一个双引号字符串,它将无法正常工作

text = 'qarcac,"this is, test1","this is, test2", 123566, testdata'
并产生以下输出

split1:qarcc,“这是测试1”

split2:“这是,test2”

拆分3:123566


有人能给我解释一下这里发生了什么,以及在这两种情况下非捕获组的工作方式有什么不同吗?

这与(非)捕获组无关

(?:“[^”]*”*[^”]*$
匹配:

  • “[^”]*”
    -带引号的字符串(两个引号之间有0个或多个非引号)
  • (?:…)*
    -0个或多个带引号的字符串
  • [^”]*
    -后跟0个或多个非引号
  • $
    -后跟字符串末尾
换句话说,这个正则表达式匹配类似于
“foo”“bar”“baz”otherstuff的内容

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

qarcac,"this is, test1",123566
       ^^^^^^^^^^^^^^^^^^^^^^^
qarcac,"this is, test1","this is, test2", 123566, testdata
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我在上面的正则表达式匹配的部分画了下划线(一个带引号的部分,后跟一个不带引号的尾部,后跟字符串的末尾)

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

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”
,两者之间没有任何内容


如果您只想确保每个匹配的逗号都在带引号的部分之外(即后跟偶数个引号),您只需使用

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

作为正则表达式。

您应该使用
csv
模块来解析csv字符串。您正在使用的正则表达式效率很低,如果字符串很长,性能可能会显著下降。感谢Wiktor,我不会将其产品化,而是尝试学习,因为我在我的一个学习模块中遇到了此代码。有效的模式是
,(?=(?:“[^”]*“|[^”]*$)
。或
,(?=[^”]*(?:“[^”]*“[^”]*)*$)
。请参阅。请参阅,在右侧的模式字段中键入的任何正则表达式都有一个很好的解释。感谢Wiktor。.当使用[^”]*时,re.split()如何使用以下正则表达式标记源字符串中第一次出现的逗号,(?=(?:“[^”]*“|[^”])*$)谢谢。。您能否澄清为什么[^“]*用于非捕获组?