在Python中拆分一个带括号的字符串(多个拆分器)

时间:2015-04-03 19:21:12

标签: python python-2.7

我有一个字符串,例如:

  

" AB(abcds)kadf(SD)K(AFSD)(lbne)"

我想将其拆分为一个列表,以便列表存储如下:

  

a   b
  abcds
  ķ
  一个
  d
  ˚F
  SD
  ķ
  AFSD
  lbne

我需要将括号外的元素放在单独的行中,将其中的元素放在单独的行中。 我无法想到解决这个问题的任何方法。

4 个答案:

答案 0 :(得分:3)

您可以使用iter创建迭代器并使用itertools.takewhile来提取parens之间的字符串:

it = iter(s)
from itertools import takewhile
print([ch if ch != "(" else  "".join(takewhile(lambda x: x!= ")",it)) for ch in it])
['a', 'b', 'abcds', 'k', 'a', 'd', 'f', 'sd', 'k', 'afsd', 'lbne']

如果ch不等于(,我们只需取其他字符,如果ch是(我们使用takewhile,这将继续使用字符,直到我们点击)

或者使用re.findall获取所有字符串以()开头和结尾\((。+?))`和所有其他字符:

print([''.join(tup) for tup in re.findall(r'\((.+?)\)|(\w)', s)])
['a', 'b', 'abcds', 'k', 'a', 'd', 'f', 'sd', 'k', 'afsd', 'lbne']

答案 1 :(得分:2)

您有两种选择。真正容易的就是迭代字符串。

in_parens=False
buffer=''
for char in my_string:

    if char =='(':
       in_parens=True
    elif char==')':
       in_parens = False
       my_list.append(buffer)
       buffer=''
    elif in_parens:
       buffer+=char
    else:
       my_list.append(char)

另一种选择是正则表达式。

我会建议正则表达式。值得实践

答案 2 :(得分:2)

你只需要使用' re.split'和一些逻辑。

import re
string = "ab(abcds)kadf(sd)k(afsd)(lbne)"
temp = []
x = re.split(r'[(]',string)
#x = ['ab', 'abcds)kadf', 'sd)k', 'afsd)', 'lbne)']
for i in x:
    if ')' not in i:
        temp.extend(list(i))
    else:
        t = re.split(r'[)]',i)
        temp.append(t[0])
        temp.extend(list(t[1]))
print temp
#temp = ['a', 'b', 'abcds', 'k', 'a', 'd', 'f', 'sd', 'k', 'afsd', 'lbne']

查看追加和扩展here的差异。 我希望这会有所帮助。

答案 3 :(得分:-1)

尝试:Python re。如果你是新手,可能需要一些时间,但是一旦你得到它就可以进行各种字符串操作。

import re
search_string = 'ab(abcds)kadf(sd)k(afsd)(lbne)'

re_pattern = re.compile('(\w)|\((\w*)\)') # Match single character or characters in parenthesis

print [x if x else y for x,y in re_pattern.findall(search_string)]