在python中拆分字符串
Posted
技术标签:
【中文标题】在python中拆分字符串【英文标题】:Splitting strings in python 【发布时间】:2010-09-19 01:40:19 【问题描述】:我有一个这样的字符串:
这是[括号测试]“和引号测试”
我正在尝试在 Python 中编写一些东西以按空格将其拆分,同时忽略方括号和引号中的空格。我正在寻找的结果是:
['this','is','bracket test','and quotes test']
【问题讨论】:
括号嵌套吗?引号内可以有不匹配的括号吗?不匹配的引号或括号怎么办?以下内容的正确输出是什么:[[嵌套括号]测试]“胸罩[引号内”“ket]引号内”[引号“括号内]”] 【参考方案1】:这是一个适用于您的测试输入的简单解决方案:
import re
re.findall('\[[^\]]*\]|\"[^\"]*\"|\S+',s)
这将返回任何匹配的代码
一个左括号,后跟零个或多个非右括号字符,后跟一个右括号, 双引号后跟零个或多个非引号字符后跟引号, 任何一组非空白字符这适用于您的示例,但对于您可能遇到的许多实际字符串可能会失败。例如,您没有说出您对不平衡括号或引号的期望,或者您希望单引号或转义字符如何工作。不过,对于简单的情况,以上内容可能就足够了。
【讨论】:
这会留下引号和括号。这不正是我们所要求的。【参考方案2】:完成 Bryan 的帖子并准确匹配答案:
>>> import re
>>> txt = 'this is [bracket test] "and quotes test "'
>>> [x[1:-1] if x[0] in '["' else x for x in re.findall('\[[^\]]*\]|\"[^\"]*\"|\S+', txt)]
['this', 'is', 'bracket test', 'and quotes test ']
不要误解所使用的整个语法:这不是一行中的多个语句,而是一个功能性语句(更防错)。
【讨论】:
【参考方案3】:这是一个简单的解析器(针对您的示例输入进行了测试),它引入了 State 设计模式。
在现实世界中,您可能希望使用 PLY 之类的东西构建一个真正的解析器。
class SimpleParser(object):
def __init__(self):
self.mode = None
self.result = None
def parse(self, text):
self.initial_mode()
self.result = []
for word in text.split(' '):
self.mode.handle_word(word)
return self.result
def initial_mode(self):
self.mode = InitialMode(self)
def bracket_mode(self):
self.mode = BracketMode(self)
def quote_mode(self):
self.mode = QuoteMode(self)
class InitialMode(object):
def __init__(self, parser):
self.parser = parser
def handle_word(self, word):
if word.startswith('['):
self.parser.bracket_mode()
self.parser.mode.handle_word(word[1:])
elif word.startswith('"'):
self.parser.quote_mode()
self.parser.mode.handle_word(word[1:])
else:
self.parser.result.append(word)
class BlockMode(object):
end_marker = None
def __init__(self, parser):
self.parser = parser
self.result = []
def handle_word(self, word):
if word.endswith(self.end_marker):
self.result.append(word[:-1])
self.parser.result.append(' '.join(self.result))
self.parser.initial_mode()
else:
self.result.append(word)
class BracketMode(BlockMode):
end_marker = ']'
class QuoteMode(BlockMode):
end_marker = '"'
【讨论】:
【参考方案4】:这是一个更程序化的方法:
#!/usr/bin/env python
a = 'this is [bracket test] "and quotes test "'
words = a.split()
wordlist = []
while True:
try:
word = words.pop(0)
except IndexError:
break
if word[0] in '"[':
buildlist = [word[1:]]
while True:
try:
word = words.pop(0)
except IndexError:
break
if word[-1] in '"]':
buildlist.append(word[:-1])
break
buildlist.append(word)
wordlist.append(' '.join(buildlist))
else:
wordlist.append(word)
print wordlist
【讨论】:
【参考方案5】:好吧,我已经多次遇到这个问题,这导致我编写了自己的系统来解析任何类型的语法。
这个结果可以在here找到;请注意,这可能是多余的,它会为您提供一些东西,让您可以根据需要解析带有括号和括号、单引号和双引号的语句。例如,您可以解析这样的内容(用 Common Lisp 编写的示例):
(defun hello_world (&optional (text "Hello, World!"))
(format t text))
您可以使用嵌套、方括号(方)和圆括号(圆)、单引号和双引号字符串,而且扩展性非常好。
这个想法基本上是有限状态机的可配置实现,它逐个字符地构建抽象语法树。我建议您查看源代码(请参阅上面的链接),以便您了解如何操作。它可以通过正则表达式实现,但是尝试使用 RE 编写一个系统,然后尝试扩展它(甚至理解它)。
【讨论】:
【参考方案6】:仅适用于报价。
rrr = []
qqq = s.split('\"')
[ rrr.extend( qqq[x].split(), [ qqq[x] ] )[ x%2]) for x in range( len( qqq ) )]
print rrr
【讨论】:
以上是关于在python中拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章