【问题标题】:Python RegEx Comma Delim [duplicate]Python RegEx逗号分隔符[重复]
【发布时间】:2018-12-06 12:02:49
【问题描述】:

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

我知道 ?: 用于非捕获组, ?= 用于向前看,但不确定它在当前上下文中的工作方式。

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

【问题讨论】:

  • 您的正则表达式在双引号外的逗号上拆分
  • 感谢 anubhava.. 我可以知道为什么我需要这个 (?:[^"]*"[^"]*") 以及为什么不简单地这个 (?:"[^"]*" )
  • 因为前瞻必须提前计算偶数个引号,以确保拆分逗号在引号之外。
  • 永远不要在生产中使用这个正则表达式,它效率太低并且可能会冻结你的代码。在 Python 中,有一个内置的 CSV 解析器,使用它。
  • 感谢 Wiktor... 会试试的

标签: python regex regex-lookarounds


【解决方案1】:

让我们分解一下。

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

    • ,
  2. 现在我们需要向前看,以确保这个逗号不在一对引号内。我们期待(?=...)

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

所有这些加在一起 ,(?=(?:[^"]*"[^"]*")*[^"]*$)

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

【讨论】:

  • 完美的 Jabob,明白了
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
相关资源
最近更新 更多