对待字符串,基本的方式是正则表达式工具(模块re
)
鉴于您提供的信息(这意味着它们可能不充分),以下代码可以完成这项工作:
import re
r = re.compile('(?! )[^[]+?(?= *\[)'
'|'
'\[.+?\]')
s1 = "Quantity [*,'EXTRA 05',*] [*,'EXTRA 09',*]"
print r.findall(s1)
print '---------------'
s2 = "'zug hug'Quantity boondoggle 'fish face monkey "\
"dung' [*,'EXTRA 05',*] [*,'EXTRA 09',*]"
print r.findall(s2)
结果
['Quantity', "[*,'EXTRA 05',*]", "[*,'EXTRA 09',*]"]
---------------
["'zug hug'Quantity boondoggle 'fish face monkey dung'", "[*,'EXTRA 05',*]", "[*,'EXTRA 09',*]"]
正则表达式模式必须如下所示:
'|'
表示或
所以正则表达式模式表达了两个部分 RE:
(?! )[^[]+?(?= *\[)
和
\[.+?\]
第一部分 RE :
核心是[^[]+
括号定义了一组字符。符号^
在第一个括号之后[
,这意味着该集合被定义为所有不是符号后面的字符^
。
目前[^[]
表示不是左括号 [ 的任何字符,+
并且由于在此 set 定义之后有一个,[^[]+
表示其中的字符序列没有左括号。
现在,在 之后有一个问号[^[]+
:这意味着捕获的序列必须在问号之后的符号之前停止。
这里,紧随其后的?
是(?= *\[)
先行断言,由(?=....)
表示它是肯定的先行断言和 的信号组成 *\[
,最后一部分是捕获的序列必须在其前面停止的序列。 *\[
表示:零、一个或多个空格,直到左括号(需要反斜杠\
来消除[
作为一组字符的开头的含义)。
在核心前面还有(?! )
一个否定的前瞻断言:有必要使这个部分RE只捕获以空白开头的序列,因此避免捕获连续的空白。去掉这个(?! )
,你会看到效果。
第二部分 RE :
\[.+?\]
表示:左括号字符 [,由.+?
(与除 之外的任何字符匹配的点\n
)捕获的字符序列,该序列必须在结束括号字符]之前停止,这是要捕获的最后一个字符。
.
编辑
string = "Quantity [*,'EXTRA 05',*] [*,'EXTRA 09',*]"
import re
print re.split(' (?=\[)',string)
结果
['Quantity', "[*,'EXTRA 05',*]", "[*,'EXTRA 09',*]"]
!!