除括号环境外,用逗号分隔字符串

2024-10-02 22:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望在Python多行字符串的逗号处拆分,除非逗号位于括号内的表达式中。E、 g.,绳子

{J. Doe, R. Starr}, {Lorem
{i}psum dolor }, Dol. sit., am. et.

应该分成

^{pr2}$

这涉及到括号匹配,所以正则表达式可能在这里没有帮助。PyParsing有{a2},它几乎可以满足我的需要,除了引用的")环境是受保护的,而不是{}分隔的环境。在

有什么提示吗?在


Tags: 字符串环境表达式amet括号逗号doe
3条回答

{a1在Python中可以用一个更短的^ I来代替它:

>>> import regex
>>> r = regex.compile(r'({(?:[^{}]++|\g<1>)*})(*SKIP)(*FAIL)|\s*,\s*')
>>> s = """{J. Doe, R. Starr}, {Lorem
{i}psum dolor }, Dol. sit., am. et."""
>>> print(r.split(s))
['{J. Doe, R. Starr}', None, '{Lorem\n{i}psum dolor }', None, 'Dol. sit.', None, 'am. et.']

模式({(?:[^{}]++|\g<1>)*})(*SKIP)(*FAIL)-匹配{...{...{}...}...}类结构(如{匹配{(?:[^{}]++|\g<1>)*匹配2个备选方案的0+次出现:1)除{}(The [^{}]++)之外的任何1+字符,2)匹配整个({(?:[^{}]++|\g<1>)*})子模式的文本)。(*SKIP)(*FAIL)动词使引擎忽略匹配缓冲区中的全部匹配值,因此,将索引移动到匹配的末尾,并且不保留任何要返回的内容(我们“跳过”匹配的内容)。在

\s*,\s*匹配用0+空格括起来的逗号。在

出现None值是因为第一个分支中有一个捕捉组,当第二个分支匹配时该组为空。我们需要在第一个可选分支中使用一个捕获组来进行递归。要删除空元素,请使用“理解”:

^{pr2}$

在这种情况下,可以使用^{}

>>> from re import split
>>> data = '''\
... {J. Doe, R. Starr}, {Lorem
... {i}psum dolor }, Dol. sit., am. et.'''
>>> split(',\s*(?![^{}]*\})', data)
['{J. Doe, R. Starr}', '{Lorem\n{i}psum dolor }', 'Dol. sit.', 'am. et.']
>>>

下面是正则表达式模式匹配的说明:

^{pr2}$

编写您自己的自定义拆分函数:

 input_string = """{J. Doe, R. Starr}, {Lorem
 {i}psum dolor }, Dol. sit., am. et."""


 expected = ['{J. Doe, R. Starr}', '{Lorem\n{i}psum dolor }', 'Dol. sit.', 'am. et.']

 def split(s):
     parts = []
     bracket_level = 0
     current = []
     # trick to remove special-case of trailing chars
     for c in (s + ","):
         if c == "," and bracket_level == 0:
             parts.append("".join(current))
             current = []
         else:
             if c == "{":
                 bracket_level += 1
             elif c == "}":
                 bracket_level -= 1
             current.append(c)
     return parts

 assert split(input_string), expected

相关问题 更多 >