【问题标题】:Split string by delimiter only if not wrapped in certain pattern仅当未以特定模式包装时,才按分隔符拆分字符串
【发布时间】:2013-12-06 08:55:35
【问题描述】:

我试图通过分隔符将字符串拆分为列表(比如说,),但分隔符只有在没有以某种模式包装时才应被视为分隔符,在我的特殊情况下为<> . IOW,当逗号嵌套在<> 中时,它会作为分隔符被忽略,而只是一个不被分隔的常规字符。

所以如果我有以下字符串:

"first token, <second token part 1, second token part 2>, third token"

应该拆分成

list[0] = "first token"
list[1] = "second token part 1, second token part 2"
list[2] = "third token"

不用说,我不能只用, 进行简单的拆分,因为这会将第二个标记分成两个标记,second token part 1second token part 2,因为它们之间有一个逗号。

我应该如何定义使用Python RegEx 的模式?

【问题讨论】:

  • @Farhadix,这并没有告诉我如何避免逗号包裹在&lt;&gt;
  • @Farhadix 我看不出这个问题对 OP 有何帮助?
  • 这些模式可以嵌套吗?它们总是正确平衡吗?他们能逃脱吗?如&lt;second &lt;nested&gt; token with \&gt; escaped bracket&gt;?
  • 当它们嵌套时,它们作为分隔符被忽略。即如果,&lt;&gt; 内,则它不再是分隔符
  • 但是,&lt;&gt; 可以嵌套在其他 &lt;&gt;s 中。例如。 &lt;part X.1&lt;part X.2&gt;&gt;

标签: python regex


【解决方案1】:

一种适用于您的示例的笨拙方法是将 转换为 ",然后将其视为 CSV 文件:

import csv
import string

s = "first token, <second token part 1, second token part 2>, third token"    
a = s.translate(string.maketrans('<>', '""'))
# first token, "second token part 1, second token part 2", third token
print next(csv.reader([a], skipinitialspace=True))
['first token', 'second token part 1, second token part 2', 'third token']

【讨论】:

  • 您可能想提及(或处理)这会排除在数据的其他地方使用引号。
  • 这不适用于嵌套括号。上面的注释表明它们可能是嵌套的。
【解决方案2】:

更新:由于您提到括号可能是嵌套的,我很遗憾地通知您,Python 中的正则表达式解决方案是不可能的。仅当尖括号始终保持平衡且从不嵌套或转义时,以下方法才有效:

>>> import re
>>> s = "first token, <second token part 1, second token part 2>, third token"
>>> regex = re.compile(",(?![^<>]*>)")
>>> regex.split(s)
['first token', ' <second token part 1, second token part 2>', ' third token']
>>> [item.strip(" <>") for item in _]
['first token', 'second token part 1, second token part 2', 'third token']

正则表达式 ,(?![^&lt;&gt;]*&gt;) 仅在下一个尖括号不是右尖括号时才以逗号分隔。

嵌套括号会阻止这个或任何其他正则表达式解决方案在 Python 中工作。您要么需要一种支持递归正则表达式的语言(如 Perl 或 .NET 语言),要么使用解析器。

【讨论】:

  • 正则表达式匹配“第一个标记,,>,第三个标记”中的逗号。
  • @sln:是的,这就是我写的。没有正则表达式解决方案可以处理嵌套标签(如果嵌套是任意的)。不幸的是,关于嵌套可能的信息是在我写完答案之后才出现的。
  • 是的,没有 Python 正则表达式可以。正如你所说,其他人可以,这真的很微不足道。
  • 已验证。传递功能 AND 优雅 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多