Python正则表达式逗号Delim

Python正则表达式逗号Delim,python,regex,regex-lookarounds,Python,Regex,Regex Lookarounds,我正在尝试使用以下代码拆分逗号分隔的字符串。逗号分隔的正则表达式代码在我的一个在线课程中使用。我试图理解下面的正则表达式,看看它是如何工作的,但无法完全理解它。有人能告诉我它是怎么工作的吗 我知道?:用于非捕获组?=用于前瞻,但不确定它在当前上下文中如何工作 import re pattern = re.compile(r',(?=(?:[^"]*"[^"]*")*[^"]*$)') text = 'tarcac,"this is, test1","this is, test2", 123566

我正在尝试使用以下代码拆分逗号分隔的字符串。逗号分隔的正则表达式代码在我的一个在线课程中使用。我试图理解下面的正则表达式,看看它是如何工作的,但无法完全理解它。有人能告诉我它是怎么工作的吗

我知道?:用于非捕获组?=用于前瞻,但不确定它在当前上下文中如何工作

import re
pattern = re.compile(r',(?=(?:[^"]*"[^"]*")*[^"]*$)')
text = 'tarcac,"this is, test1","this is, test2", 123566, testdata'
results= re.split(pattern, text)
for r in results:
   print(r.strip())
输出为

tarcac
"this is, test1"
"this is, test2"
123566
testdata

让我们来分析一下

  • 我们试图寻找逗号,它是字符串的分隔部分。所以首先我们需要找一个逗号

  • 现在我们需要向前看,确保这个逗号不在一对引号内。我们展望未来,
    (?=…)

    • 我们正在查找第一个
      ,以便尽可能多地匹配非引号。(我们使用
      ^”
      来表示任何注释为引号的字符)
      [^]*
      ,然后我们查找第一个引号,这使得:
      • [^”]*“
    • 如果我们匹配了第一个引号,我们需要查找第二个引号。它们之间可以有任意数量的非引号字符(
      [^”]*
      ),因此我们重复
      • [^”]*“
    • 我们希望尽可能多地匹配任意两对引号(无需捕获),因此我们会查找引用字符串的零到无限次出现
      • (?:[^”]*“[^”]*”*
    • 这使得:
      (?=(?:[^”]*“[^”]*”)
  • 最后,我们希望匹配任何剩余的非引号字符,然后我们希望匹配字符串的结尾(由
    $
    指示)
    • [^”]*$
  • 所有这些加在一起就产生了
    ,(?=(?:[^“]*”[^“]*”*[^“]*”*[^“]*$)


    本质上,它是通过检查逗号后的每个引号
    字符是否可以与结束引号字符配对来匹配逗号。这就是为什么输出不在
    “这是,test1”
    “这是,test2”中创建逗号的原因“

    您的正则表达式是在双引号Hanks anubhava外的逗号上拆分的。”。。我可以知道为什么我需要这个(?[^“]*”[^“]*”)吗?为什么不简单地使用这个(?“[^”]*”)因为lookahead必须先计算偶数个引号,以确保分隔逗号在引号之外。不要在生产中使用此正则表达式,它效率太低,可能会冻结您的代码。在Python中,有一个内置的CSV解析器,请使用它。感谢Wiktor…我会尝试完美的Jabob,明白了吗