3

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

我想把字符串当代建筑(2000 ce to present)分成三个键:contemporarybuilding(s)(2000 c.e. to present)

到目前为止,我一直在使用re.findall('\w+', key)

任何帮助是极大的赞赏。

4

3 回答 3

3

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

于 2012-05-12T18:30:23.940 回答
2

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

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

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

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

于 2012-05-12T18:20:48.517 回答
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只返回您想要的匹配项。

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

于 2012-05-12T19:01:51.430 回答