簡體   English   中英

在python中拆分字符串

[英]Splitting strings in python

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

這是[支架測試]“和引用測試”

我正在嘗試用Python編寫一些東西,用空格分割,同時忽略方括號和引號中的空格。 我正在尋找的結果是:

['this','is','支架測試','和報價測試']

這是一個簡單的解決方案,適用於您的測試輸入:

import re
re.findall('\[[^\]]*\]|\"[^\"]*\"|\S+',s)

這將返回任何匹配的代碼

  • 一個開括號,后跟零或多個非近括號字符后跟一個緊括號,
  • 雙引號后跟零個或多個非引號字符后跟引號,
  • 任何一組非空白字符

這適用於您的示例,但對於您可能遇到的許多真實字符串可能會失敗。 例如,您沒有說出您對不平衡括號或引號的期望,或者您希望單引號或轉義字符如何工作。 但是,對於簡單的情況,上述情況可能已經足夠了。

完成布萊恩的帖子並完全匹配答案:

>>> 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 ']

不要誤解所使用的整個語法:這不是單行上的幾個語句,而是單個功能語句(更多的bug)。

這是一個簡單的解析器(針對您的示例輸入進行測試),它引入了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 = '"'

這是一個更程序化的方法:

#!/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

好吧,我已經遇到過這個問題很多次了,這讓我編寫了自己的系統來解析任何一種語法。

結果可以在這里找到; 請注意,這可能是過度的,並且它將為您提供一些東西,允許您使用括號和括號,單引號和雙引號來解析語句,如您所希望的那樣嵌套。 例如,你可以解析這樣的東西(用Common Lisp編寫的例子):

(defun hello_world (&optional (text "Hello, World!"))
    (format t text))

您可以使用嵌套,方括號(方括號)和圓括號(圓形),單引號和雙引號字符串,並且它是非常可擴展的。

該想法基本上是有限狀態機的可配置實現,其逐個字符地構建抽象語法樹。 我建議你查看源代碼(參見上面的鏈接),這樣你就可以了解如何做到這一點。 它可以通過正則表達式,但嘗試使用RE編寫系統,然后嘗試擴展它(甚至理解它)。

僅適用於報價。

rrr = []
qqq = s.split('\"')
[ rrr.extend( qqq[x].split(), [ qqq[x] ] )[ x%2]) for x in range( len( qqq ) )]
print rrr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM