2015-07-20 25 views
0

好了,所以这里有一个简短:删除字符串的十六进制表示 - Python的

目的:检测到一个字符串包含十六进制值,要么正确提取或删除它们。

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

我曾尝试:我试着写之前检查每一个元素,它是否是一个有效的字符串,由如果type(element) == str:isinstance(element) == unicode但不起作用。

我该如何解决这个问题?

的额外信息: 我做了什么:

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

回答

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'> 
+0

如果该字符串是'UHVHFWLRQ◄QEVS▲♥/ RZ♥ULVN♥IHDWXUHV↔QEVS▲♥2OLJRGHQGURJOLRPD♥RU♥PL [HG'? – complextea

+1

然后它包含创建Excel文件之前需要转义的无效字符。 –

+0

我怎么能做到这一点?从上面注释中的字符串中,我可以消除“心脏”或“三角形”等特殊符号,但由字母组成的垃圾字符串仍然存在。你能提出一些建议吗? @Charlie Clark – complextea

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 & \x0c因为它们是可打印字符之间。

e = filter(lambda x: x in string.printable, e) 
相关问题