我试图用非捕获组来理解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
有人可以向我解释一下这是怎么回事,以及这两种情况下非捕获小组的工作方式有何不同?
答案 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"
,而中间没有任何内容。
如果您只是想确保每个匹配的逗号都在引号部分之外(即引号后面是偶数),则可以简单地使用
,(?=[^"]*(?:"[^"]*"[^"]*)*$)
作为您的正则表达式。