处理字符串的基本方法是使用正则表达式工具 ( 模块 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:
核心是[^[]+。
括号定义一组字符。符号^在第一个括号[后面,它的意思是将该集合定义为不是跟随符号^的那些字符的所有字符。
目前,[^[]意味着任何不是开放括号[的字符,并且由于在此集合的定义之后有+,所以[^[]+表示其中没有括号的字符序列。
现在,在[^[]+后面有一个问号:它意味着捕获的序列必须在问号后面的符号中停止。
这里,问号后面的是?= *\ [,它是一个前瞻断言,由?=…组成,表示它是一个积极的前瞻断言,由* \ [组成,这是捕获的序列必须停止的序列。 *\[表示:零、一个或多个空格直到开放括号(需要反斜杠\来消除[作为字符集开放的含义)。
核心前面也有(!),这是一个负向前瞻断言:必须使此部分RE仅捕获以空格开头的序列,从而避免捕获空格的连续。
删除此(!)并查看效果。
第二部分RE:
\[.+?\]表示:开放括号字符[,一个由。+?捕获的字符序列(点与任何字符匹配,除了\n),这个序列必须在结束括号字符]前停止,这是最后一个要捕获的字符。
。
string = "Quantity [*,'EXTRA 05',*] [*,'EXTRA 09',*]"
import re
print re.split(' (?=\[)',string)
结果
['Quantity', "[*,'EXTRA 05',*]", "[*,'EXTRA 09',*]"]
!!