如何在保留括号的同时拆分字符串

时间:2012-05-12 18:08:38

标签: python regex

我正在拆分字符串以生成字典的键,但我在括号中遇到问题。

我想把字符串当代建筑(2000年至今)并将其拆分为三个键:contemporarybuilding(s)和{ {1}}

到目前为止,我一直在使用(2000 c.e. to present)

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

如果括号内没有括号,也可以使用re.findall('[(][^)]*[)]|\S+', key)

答案 1 :(得分:2)

你可以用正则表达式做到这一点。你绝对可以用解析器来做。但是,这两者都非常复杂,所以除非你需要更多的力量和通用性,为什么不将re.findall('\w+', key)的各个部分合并在一起呢?

parts = re.findall('[\w)(\.]+', key)
[parts[0], parts[1], parts[2] + " " + parts[3] + " " + parts[4] + " " + parts[5]]

更一般地说,你可以遍历计算开括号和近括号数的部分。保持一个计数器,每个打开的paren递增,每个关闭的paren递减。每次计数器从0变为1时,开始连接部分,并在它再次达到0时停止。

这些简单的解决方案取决于您的字符串相当简单和良好的行为,但所有解决方案都会在某种程度上。

答案 2 :(得分:2)

以下正则表达式应该使用re.findall

(?:\w+(?:\(\w+\))?)|(?:\([\w\ \.]+\)))

第一组(?:\w+(?:\(\w+\))?)匹配一系列单词字符,后跟括号内的可选系列字词。

\w+ - word character one or more times
\(\w+\)? - (optional) opening parenthesis, word character one or more times,
           closing parenthesis

第二组(?:\([\w\ \.]+\)))匹配括在括号中的任何单词字符,空格或句点。

\([\w\ \.]+\) - opening partnthesis, (either a word character,
                space or period one or more times), closing parenthesis

每个组开头的?:只是意味着不捕获它,因此.findall只返回您想要的匹配项。

这只能保证能够处理您提供的示例或非常相似的内容,并且如果输入中会有更多的差异,可以做一些额外的考虑,但这是一个开始。