python中的字符串修改; \和"造成问题

时间:2017-10-24 19:13:54

标签: python regex string

流程:

  1. 从黑盒子里读取.csv
  2. 修改内容
  3. 将其保存为JSON
  4. 将其发送回blackbox
  5. 我已经按照以下方式完成了这项工作:

      with open (argv[1], "r", encoding="utf-8") as inFile:
          csv.register_dialect('beenix', delimiter = ';', quoting=csv.QUOTE_MINIMAL)
          csvRead = csv.reader(inFile, dialect='beenix') 
          newList = []
        for line in csvRead:
            tempString = str(line)
            tempString = tempString.replace(" / ", ",")
            tempString = tempString.replace("\'", "")
            tempString = tempString.replace("\\\"", "") # doesn't work
            tempString = tempString.replace("[", "")
            tempString = tempString.replace("]", "")
            re.sub(r'[\"]', "", tempString) # doesn't work
            parts = tempString.split(",")
            tempDict = {"district": parts[2], "quotient": float(parts[4].strip()), "party": parts[1],"votes": int(parts[3].strip()), "name": parts[0]}
            newList.append(tempDict)
      with open (argv[2], "w", encoding="utf-8") as outFile:
          json.dump(newList, outFile, indent=3)
    

    所以,问题在于,我似乎无法删除" \""来自字符串的(\和" -sequences)。 已经尝试了以下方法:

    tempString.replace("\\\"", "")
    
    re.sub(r'[\"]', "", tempString)
    

    感谢您的时间。

4 个答案:

答案 0 :(得分:3)

这是一个XY问题。

不必将列表转换为字符串表示,然后删除引号,分隔符,括号......

这是一个非常糟糕的主意,因为csv模块以您想要的格式提供数据而不需要任何努力:

for parts in csvRead:

此时parts是一个包含行数据的列表,没有任何引号或转义字符。

(好吧,它没有回答替换问题,但它以更好的方式解决了你的问题)

注意:如果在解码字段后,真的想要替换一些剩余的反斜杠,这很简单,只是不要过度:

>>> foo = r"a\b"
>>> foo.replace("\\","")
'ab'

同样适用于双引号。使用备用引号避免转义:

>>> foo = 'a"b'
>>> foo.replace('"',"")
'ab'

答案 1 :(得分:0)

尝试

tempString = tempString.replace(r'\"', '')

字符串前面的前缀r使它成为raw string,所以你在引号之间看到的基本上就是你得到的东西(不需要转义特殊字符)。我用单引号括起来区分你想要匹配的引号和明确定义字符串的引号。

如果你想使用正则表达式,你需要编译你的模式(并稍微改变你的模式):

pattern = re.compile(r'\\"')  # note two back-slashes, not positive why...
new_str = re.sub(pattern, '', temp_string)

答案 2 :(得分:0)

您可以通过

替换它
tempString = 'This [is] a test \"  asd \" '
tempString = tempString.replace('\"', "") 

print tempString

答案 3 :(得分:0)

我喜欢Jean的回答,但根据你的评论,格式仍然不对吗?所以:

据我所知,由于这个tempString.replace("\\\"", "")是您尝试过的,因此您的字符串包含字面\\\"的序列(在print(your_string)中显示为\"如果您只是将\\"写入控制台而不是使用打印),或者将your_string写入要替换或消除的>>> import re >>> example = "text \n \" \"\"\"\" \\ \\\" \\\"\\\" text" >>> example 'text \n " """" \\ \\" \\"\\" text' >>> result = re.sub(r'(\\\")+', 'POOF', example) >>> result 'text \n " """" \\ POOF POOF text' ,如果是这样的话:(添加了各种形式的反斜杠和引号以准确显示替代将会而且不会取代)

" """"

除非您还想在将result写入控制台或打印时替换那些看起来像>>> result2 = re.sub(r'\"+', 'Quotes-were-here', result) >>> result2 'text \n Quotes-were-here Quotes-were-here \\ POOF POOF text' 的转义双引号:

\\\"

我写了#34; POOF"这样做是为了使更清楚的东西更清楚,但你也可以在那里放一个空字符串。

对于第一个结果,发生了什么:正则表达式的+意味着转义反斜杠与转义双引号连接,括号表示我想将它们组合在一起并使正则表达式匹配正则表达式作为一个整体,然后r'\\\"'表示匹配这些组中的一个或多个。 (编辑:或者,+单独也可以使用,在这种情况下它会读取" POOF POOFPOOF"在结果中,我想我想到的是+签名,因为这是我想到的第一个翻译"这个字符序列中的一个或多个")

对于第二个,它只是单独的转义doubleQuotes,它读作单个字符(就像' \ n'),因此在{{1}之前不需要括号}}