我正在拆分字符串以生成字典的键,但我在括号中遇到问题。
我想把字符串当代建筑(2000年至今)并将其拆分为三个键:contemporary
,building(s)
和{ {1}}
到目前为止,我一直在使用(2000 c.e. to present)
非常感谢任何帮助。
答案 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
只返回您想要的匹配项。
这只能保证能够处理您提供的示例或非常相似的内容,并且如果输入中会有更多的差异,可以做一些额外的考虑,但这是一个开始。