Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的字符串拆分_Python_String_Split_Parsing_Tokenize - Fatal编程技术网

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) 这将返回任何匹配的代码 一个开括号,后跟零个或多个非闭括号字符,后跟一个闭括号 双引号,后跟零个或多个

我有一个字符串,如下所示:

这是[括号测试]“和引号测试”

我试图用Python编写一些东西,将其按空间分割,同时忽略方括号和引号中的空格。我想要的结果是:


['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))