Python RegEx逗号清除

时间:2018-06-27 14:27:30

标签: python regex regex-lookarounds

我正在尝试使用以下代码分割逗号分隔的字符串。我的一门在线课程中使用了以逗号分隔的正则表达式代码。我试图通过环顾四周理解以下正则表达式,但它无法完全理解。有人可以让我知道它是如何工作的吗?

我知道吗?:是非捕获组,?=是前瞻,但不确定在当前环境下如何工作。

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

1 个答案:

答案 0 :(得分:3)

让我们分解一下。

  1. 我们正在尝试查找分隔字符串部分的逗号。所以首先我们需要寻找一个逗号

    • ,
  2. 现在,我们需要确保该逗号不在一对引号内。我们展望(?=...)

    • 我们正在寻找第一个",因此我们可以匹配尽可能多的非引号。 (我们使用^"来表示任何带引号的字符)[^"]*,然后我们寻找第一个引号,这使得:
      • [^"]*"
    • 如果我们匹配了第一个引用,则需要寻找第二个。它们之间可以有任意数量的非引号字符([^"]*),因此我们重复
      • [^"]*"
    • 我们希望尽可能多地匹配任意两对引号(不捕获),因此我们寻找零到无限次出现的带引号的字符串
      • (?:[^"]*"[^"]*")*
    • 这使得:(?=(?:[^"]*"[^"]*")*)
  3. 最后,我们希望匹配所有剩余的非引号字符,然后希望匹配字符串的结尾(由$表示)
    • [^"]*$

所有这些都给  ,(?=(?:[^"]*"[^"]*")*[^"]*$)

本质上,它试图通过检查逗号后的每个引号"可以与结束引号字符配对来尝试匹配逗号。这就是为什么输出不会在"this is, test1""this is, test2"

中加逗号的原因