我正在尝试使用以下代码分割逗号分隔的字符串。我的一门在线课程中使用了以逗号分隔的正则表达式代码。我试图通过环顾四周理解以下正则表达式,但它无法完全理解。有人可以让我知道它是如何工作的吗?
我知道吗?:是非捕获组,?=是前瞻,但不确定在当前环境下如何工作。
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
答案 0 :(得分:3)
让我们分解一下。
我们正在尝试查找分隔字符串部分的逗号。所以首先我们需要寻找一个逗号
,
现在,我们需要确保该逗号不在一对引号内。我们展望(?=...)
"
,因此我们可以匹配尽可能多的非引号。 (我们使用^"
来表示任何带引号的字符)[^"]*
,然后我们寻找第一个引号,这使得:
[^"]*"
[^"]*
),因此我们重复
[^"]*"
(?:[^"]*"[^"]*")*
(?=(?:[^"]*"[^"]*")*)
$
表示)
[^"]*$
所有这些都给
,(?=(?:[^"]*"[^"]*")*[^"]*$)
本质上,它试图通过检查逗号后的每个引号"
可以与结束引号字符配对来尝试匹配逗号。这就是为什么输出不会在"this is, test1"
和"this is, test2"