从字符串中删除十六进制表示 - Python

时间:2015-07-20 05:30:39

标签: python excel exception pdf openpyxl

好的,所以这里有一个简短的说明:

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

问题:我希望能够使用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工作表。

2 个答案:

答案 0 :(得分:2)

如果查看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'>

答案 1 :(得分:0)

这对我有用:

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

示例输出:

RockIsCool

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

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