我有来自ASCII文件的一些输入数据,它使用双引号来封装字符串,并且仍在这些字符串中使用双引号,例如:
"Reliable" "Africa" 567.87 "Bob" "" "" "" "S 05`56'21.844"" "No Shift"
注意坐标中使用的双引号。
所以我一直在使用:
valList = shlex.split(line)
但是shlex对于坐标中用作第二个的双引号感到困惑。
我一直在'\"\"'
对'\\\"\"'
进行查找和替换。这当然会将空字符串转换为\""
,因此我会查找并替换(此时使用空格)' \\\"\" '
到' \"\"" '
。这不是最有效的方式!
有关在坐标中处理此双引号的任何建议吗?
答案 0 :(得分:1)
我会这样做:
我会将此行文本视为csv
文件。然后根据RFC 4180:
- 醇>
如果使用双引号括起字段,则使用双引号 出现在一个字段内必须通过前面的方式进行转义 另一个双引号。例如:
" AAA"" B"" BB"" CCC"
然后您需要做的就是在坐标上添加另一个"
。所以看起来像"S 05
56! 21.844""" (NOTE extra quote)
Then you can use a standart
csv`模块将它拆开并提取必要的信息。
>>> from StringIO import StringIO
>>> import csv
>>>
>>> test = '''"Reliable" "Africa" 567.87 "Bob" "" "" "" "S 05`56'21.844""" "No Shift"'''
>>> test_obj = StringIO(test)
>>> reader = csv.reader(test_obj, delimiter=' ', quotechar='"', quoting=csv.QUOTE_ALL)
>>> for i in reader:
... print i
...
输出结果为:
['Reliable', 'Africa', '567.87', 'Bob', '', '', '', 'S 05`56\'21.844"', 'No Shift']
答案 1 :(得分:0)
我对正则表达式不太满意,但这种非正则表达式的建议可能有所帮助......
INPUT = ('"Reliable" "Africa" 567.87 "Bob" "" "" "" "S 05`56'
"'"
'21.844"" "No Shift"')
def main(input):
output = input
surrounding_quote_symbol = '<!>'
if input.startswith('"'):
output = '%s%s' % (surrounding_quote_symbol, output[1:])
if input.endswith('"'):
output = '%s%s' % (output[:-1], surrounding_quote_symbol)
output = output.replace('" ', '%s ' % surrounding_quote_symbol)
output = output.replace(' "', ' %s' % surrounding_quote_symbol)
print "Stage 1:", output
output = output.replace('"', '\"')
output = output.replace(surrounding_quote_symbol, '"')
return output
if __name__ == "__main__":
output = main(INPUT)
print "End results:", output