【问题标题】:Remove hex representations from strings - Python从字符串中删除十六进制表示 - Python
【发布时间】:2015-10-09 03:43:56
【问题描述】:

好的,这里有一个简短的:

目标:检测字符串是否包含十六进制值,并正确提取或删除它们。

问题:我希望能够使用 openpyxl 将我的字符串写入 Excel 工作表,而不会引发非法字符异常错误。

有问题的字符串示例:

'\xc2\x87,QGLYLGXDO\x03ZLWK\x03EUHDVW\x03FDQFHU\x03\xc2\x9435

或者:

'5LVN\x03VWDWXV\x1d\x033RRU\x10ULVN\x1e\x03&\\WRJHQHWLFV\x1d\x03&RPSOH[\x03\x0b\xc2\x95\x03\x16\x03FORQDO\x03FKURPRVRPDO\x03DEQRUPDOLWLHV\x0c\x1e\x030RQRVRPDO\x03 

我尝试过的:我尝试在写入之前检查每个元素,无论它是否是有效字符串,通过执行 if type(element) == str:isinstance(element) == unicode 但没有效果。

我该如何解决这个问题?

额外信息: 我做了什么:

  1. 通过互联网上免费提供的软件将 PDF 文件转换为 xls 格式。 [不幸的是,该软件只是声称将其转换为 xls,而实际上数据是用 xml 写入的]
  2. 现在,我使用这些 xml 文件并编写一个 解析器 以从中提取数据。
  3. 第三,我使用提取的数据并使用 openpyxl 包将其写入 Excel 工作表。

【问题讨论】:

    标签: python excel exception pdf openpyxl


    【解决方案1】:

    如果您查看 openpyxl 的源代码,您会发现负责检查是否允许使用字符的正则表达式,您可以使用它来检查字符串。看来\x03 是问题所在。您可以从源中剥离或转义这些字符。

    import re
    ILLEGAL_CHARACTERS_RE = re.compile(r'[\000-\010]|[\013-\014]|[\016-\037]')
    m = ILLEGAL_CHARACTERS_RE.search(s)
    m
    <_sre.SRE_Match object; span=(12, 13), match='\x03'>
    

    【讨论】:

    • 如果字符串是UHVHFWLRQ◄ QEVS▲♥/RZ♥ULVN♥IHDWXUHV↔ QEVS▲♥2OLJRGHQGURJOLRPD♥RU♥PL[HG 怎么办?
    • 然后它包含在创建 Excel 文件之前需要转义的无效字符。
    • 我怎么能做到这一点?从上面评论中的字符串中,我可以消除“心”或“三角形”等特殊符号,但由字母组成的垃圾字符串仍然存在。你能建议点什么吗? @查理克拉克
    • 您可以简单地使用正则表达式来删除它们。
    • 主要问题是:例如:假设有两个字符串A和B:A=我们有七大洲,B=上面的垃圾字符串。在这种情况下,我将如何区分垃圾信件和真实信件?如果我写正则表达式,即使是真实的字母也会被删除,不是吗?
    【解决方案2】:

    这对我有用:

    e = "\x00\x03Rock\x04Is\x09 Cool"
    m = re.split('\s+', re.sub(r"[\x00-\x1F\x7F]", ' ', e))        
    result = ' '.join(m)
    print result
    

    样本输出:

    RockIsCool
    

    以下排除了除\x0b\x0c 之外的大多数十六进制值,因为它们属于可打印字符。

    e = filter(lambda x: x in string.printable, e)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2018-08-07
      相关资源
      最近更新 更多