双引号字符串操作

时间:2014-06-16 18:52:30

标签: python

我有来自ASCII文件的一些输入数据,它使用双引号来封装字符串,并且仍在这些字符串中使用双引号,例如:

"Reliable" "Africa" 567.87 "Bob" "" "" "" "S 05`56'21.844"" "No Shift"

注意坐标中使用的双引号。

所以我一直在使用:

valList = shlex.split(line)

但是shlex对于坐标中用作第二个的双引号感到困惑。

我一直在'\"\"''\\\"\"'进行查找和替换。这当然会将空字符串转换为\"",因此我会查找并替换(此时使用空格)' \\\"\" '' \"\"" '。这不是最有效的方式!

有关在坐标中处理此双引号的任何建议吗?

2 个答案:

答案 0 :(得分:1)

我会这样做:

我会将此行文本视为csv文件。然后根据RFC 4180

  
      
  1. 如果使用双引号括起字段,则使用双引号      出现在一个字段内必须通过前面的方式进行转义      另一个双引号。例如:

         

    " AAA"" B"" BB"" CCC"

  2.   

然后您需要做的就是在坐标上添加另一个"。所以看起来像"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