火眼猊 2023-07-26 16:23 采纳率: 100%
浏览 4
已结题

re.sub不能替换所有的非打印字符,ascii为28的并不能被替换掉

这段代码是我用来处理excel数据里面的非打印字符的,我的表格中会出现一个ascii码为28的文件分隔符,并且不会被替换掉,非常奇怪,不知道是否有人遇见过类似的情况。你们是如何解决的。
    # 正则表达式模式,用于匹配非打印字符(ASCII 控制字符)
        pattern = r'[\x00-\x1F\x7F]'

        # 遍历所有工作表
        for ws in all_worksheets:
            # 遍历当前工作表的所有单元格并清洁数据
            for row in ws.iter_rows():
                for cell in row:
                    if cell.value:
                        # 将单元格值转换为字符串
                        cleaned_value = re.sub(pattern, '*', str(cell.value))
                        cell.value = cleaned_value

  • 写回答

3条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-26 18:53
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7531148
    • 以下回答由chatgpt基于相关博客总结生成:

      问题的解决方案如下:

      # 正则表达式模式,用于匹配非打印字符(ASCII 控制字符),包括ASCII为28的字符
      pattern = r'[\x00-\x1F\x7F\x1C]'
      
      # 遍历所有工作表
      for ws in all_worksheets:
          # 遍历当前工作表的所有单元格并清洁数据
          for row in ws.iter_rows():
              for cell in row:
                  if cell.value:
                      # 将单元格值转换为字符串
                      cleaned_value = re.sub(pattern, '*', str(cell.value))
                      cell.value = cleaned_value
      

      上述代码在正则表达式的模式中新增了\x1C,该字符对应ASCII为28的文件分隔符。添加了该字符后,使用re.sub函数就可以将所有的非打印字符,包括ASCII为28的字符都替换为星号(*)。这样,在遍历所有工作表的过程中,对每个单元格的值进行替换操作,最终达到替换所有非打印字符的目的。

      但需要注意,上述代码只能处理具有文字内容的单元格。如果单元格的值是日期、数值等其他类型,则可能需要根据具体情况进行适当的转换和处理。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月18日
  • 已采纳回答 12月18日
  • 创建了问题 7月26日