在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中拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 Python DataFrame 中拆分字符串

在 Python 中的列中拆分字符串

如何在python中拆分具有多个分隔符的字符串? [复制]

在python中拆分数字字符串[重复]

在 Python 中,如何将字符串拆分为多个整数?

在 Python 字符串中的最后一个分隔符上拆分?