簡體   English   中英

根據逗號數分割字符串

[英]Split string based on number of commas

我有一個用逗號分隔的文本。

例如:

FOO( something, BOO(tmp, temp), something else)

可能其他內容也包含帶逗號的字符串...

我想將FOO框內的文本拆分為元素,然后粘貼元素。

我所知道的是FOO必須有兩個逗號。

我該如何將FOO的內容分為三個要素?

備注: 其他可能是BOO(ddd,ddd)或簡單地ddd 我不能假設'FOO \\(\\ w +,BOO(\\ w +,\\ w +),\\ w + \\)'的簡單正則表達式

假設該字符串是Python代碼,則可以為此使用解析器 如果仔細查看結果,您可能會同意它的效果不如最初看起來的那么糟糕。

>>> from parser import *
>>> source="FOO( something, BOO(tmp, temp), something)"
>>> st=suite(source)
>>> st2tuple(st)
(257, (268, (269, (270, (271, (272, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'FOO')), (322, (7, '('), (330, (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'something')))))))))))))))), (12, ','), (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'BOO')), (322, (7, '('), (330, (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'tmp')))))))))))))))), (12, ','), (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'temp'))))))))))))))))), (8, ')')))))))))))))))), (12, ','), (331, (302, (306, (307, (308, (309, (312, (313, (314, (315, (316, (317, (318, (319, (320, (1, 'something'))))))))))))))))), (8, ')')))))))))))))))))), (4, ''))), (4, ''), (0, ''))

您可以使用此正則表達式

,(?=(?:(?:\([^)]*\))?[^)]*)+\)$)

在昏迷中分割您的字符串,機器人不在BOO(...)內部

樣品

您可以使用支持遞歸的regex模塊來完成此操作(用於處理嵌套結構):

import regex

s = 'FOO( something, BOO(tmp, temp), something else)'

pat = regex.compile(r'''(?(DEFINE) # inside a definition group
    # you can define subpatterns to use later
    (?P<elt>     # define the subpattern "elt"
        [^,()]*+
        (?:
            \( (?&elt) (?: , (?&elt) )* \)
            [^,()]*
        )*+
    )
)
# start of the main pattern
FOO\( \s*
    (?P<elt1> (?&elt) )  # capture group "elt1" contains the subpattern "elt"
    , \s*
    (?P<elt2> (?&elt) )  # same here
    , \s*
    (?P<elt3> (?&elt) )  # etc.
\)''', regex.VERSION1 | regex.VERBOSE )

m = pat.search(s)

print(m.group('elt1'))
print(m.group('elt2'))
print(m.group('elt3'))

演示

假設您需要FOO中的元素列表,因此請先對其進行預處理

>>> s = 'FOO( something, BOO(tmp, temp), something else)'
>>> s
'FOO( something, BOO(tmp, temp), something else)'
>>> s = re.sub(r'^[^(]+\(|\)\s*$','',s)
>>> s
' something, BOO(tmp, temp), something else'

使用正則表達式模塊:

>>> regex.split(r'[^,(]+\([^)]+\)(*SKIP)(?!)|,', s)
[' something', ' BOO(tmp, temp)', ' something else']
  • [^,(]+\\([^)]+\\)(*SKIP)(?!)跳過模式[^,(]+\\([^)]+\\)
  • |,實際上是分割輸入字符串的替代模式,在這種情況下,


另一個例子:

>>> t = 'd(s,sad,e),g(3,2),c(d)'
>>> regex.split(r'[^,(]+\([^)]+\)(*SKIP)(?!)|,', t)
['d(s,sad,e)', 'g(3,2)', 'c(d)']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM