python中的字符串拆分
我有一个字符串,如下所示: 这是[括号测试]“和引号测试” 我试图用Python编写一些东西,将其按空间分割,同时忽略方括号和引号中的空格。我想要的结果是:python中的字符串拆分,python,string,split,parsing,tokenize,Python,String,Split,Parsing,Tokenize,我有一个字符串,如下所示: 这是[括号测试]“和引号测试” 我试图用Python编写一些东西,将其按空间分割,同时忽略方括号和引号中的空格。我想要的结果是: ['this'、'is'、'bracket test'、'quotes test']这里有一个简单的解决方案,可用于您的测试输入: import re re.findall('\[[^\]]*\]|\"[^\"]*\"|\S+',s) 这将返回任何匹配的代码 一个开括号,后跟零个或多个非闭括号字符,后跟一个闭括号 双引号,后跟零个或多个
['this'、'is'、'bracket test'、'quotes test']这里有一个简单的解决方案,可用于您的测试输入:
import re
re.findall('\[[^\]]*\]|\"[^\"]*\"|\S+',s)
这将返回任何匹配的代码
- 一个开括号,后跟零个或多个非闭括号字符,后跟一个闭括号
- 双引号,后跟零个或多个非引号字符,后跟引号
- 任何一组非空白字符
这适用于您的示例,但对于您可能遇到的许多实际字符串可能会失败。例如,您没有说明不平衡方括号或引号的预期效果,也没有说明单引号或转义字符的工作方式。不过,对于简单的情况,上面的内容可能就足够了。这里有一个简单的解析器(根据示例输入进行测试),它引入了状态设计模式 在现实世界中,您可能希望使用以下内容构建一个真正的解析器
只适用于报价
rrr = []
qqq = s.split('\"')
[ rrr.extend( qqq[x].split(), [ qqq[x] ] )[ x%2]) for x in range( len( qqq ) )]
print rrr
这里有一个更为程序化的方法:
#!/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
要完成Bryan post并完全匹配答案:
>>> 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 ']
不要误解所使用的全部语法:这不是一行中的几个语句,而是一个函数语句(更防错误)。好吧,我已经多次遇到这个问题,这让我编写了自己的系统来解析任何类型的语法 其结果如下:;请注意,这可能有点过头了,它将为您提供一些东西,让您可以根据需要嵌套使用括号和圆括号、单引号和双引号来解析语句。例如,您可以解析如下内容(用CommonLisp编写的示例): 您可以使用嵌套、方括号(方括号)和圆括号(圆括号)、单引号和双引号字符串,并且它非常可扩展
该思想基本上是有限状态机的可配置实现,它逐字符建立抽象语法树。我建议您查看源代码(参见上面的链接),以便了解如何执行。它可以通过正则表达式实现,但可以尝试使用REs编写一个系统,然后在以后尝试扩展它(甚至理解它)。括号嵌套吗?引号中是否有不匹配的括号?不匹配的引号或括号呢?以下内容的正确输出是什么:[[nested方括号]test]“bra[引号内”“ket]引号内“[quote”方括号内]”]这将保留引号和和和方括号。这并不是我们所要求的。
>>> 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 ']
(defun hello_world (&optional (text "Hello, World!"))
(format t text))