[英]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.