我的字符串具有以下格式:
string = 'token1 -token2 +"token 3"'
我要提取标记和字段,如下所示:
result = [
'token1',
'-token2',
'+token 3'
]
我正在为此使用csv
模块,但未成功获取最后一个令牌为'+"token', '3"'
# for Python 2.x
try: from StringIO import StringIO
# for Python 3.x
except ImportError: from io import StringIO
import csv
f = StringIO('token1 -token2 +"token 3"')
tokens = csv.reader(f, delimiter=' ', doublequote=False, quotechar='"', quoting=csv.QUOTE_NONE)
for t in tokens: print(t)
# > ['token1', '-token2', '+"token', '3"']
答案 0 :(得分:1)
我为这种特殊情况编写了一个客户拆分器,因为格式太具体了。下面的代码可以很好地用于所提供的输入。
# for Python 2.x
try: from StringIO import StringIO
# for Python 3.x
except ImportError: from io import StringIO
import csv
f = StringIO('token1 -token2 +"token 3"')
def check_and_split(line):
tokens = []
is_quote = False
token = ''
for c in line:
if c == ' ' and (not is_quote):
is_quote = False
tokens.append(token)
token = ''
elif c == '"':
is_quote = True
else:
token += c
tokens.append(token)
return tokens
for line in f:
tokens = check_and_split(line)
for t in tokens:
print(t)
输出:
token1
-token2
+token 3
答案 1 :(得分:0)
csv不能将+"token 3"
识别为单个值,因为引号并不包含整个内容。因此,请确保他们这样做:
line = line.replace('+"', '"+')
,然后将csv.QUOTE_NONE
更改为csv.QUOTE_MINIMAL
(或只需删除quoting
arg)。