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,明白了吗