我在matlab中有一个单元格数组
columns = {'MagX', 'MagY', 'MagZ', ...
'AccelerationX', 'AccelerationX', 'AccelerationX', ...
'AngularRateX', 'AngularRateX', 'AngularRateX', ...
'Temperature'}
我使用these scripts利用matlab的hdf5write函数将数组保存为hdf5格式。
然后我使用pytables将hdf5文件读入python。单元格数组作为一个numpy字符串数组。我转换为列表,这是输出:
>>>columns
['MagX\x00\x00\x00\x08\x01\x008\xe6\x7f',
'MagY\x00\x7f\x00\x00\x00\xee\x0b9\xe6\x7f',
'MagZ\x00\x00\x00\x00\x001',
'AccelerationX',
'AccelerationY',
'AccelerationZ',
'AngularRateX',
'AngularRateY',
'AngularRateZ',
'Temperature']
这些十六进制值从某处弹出到字符串中,我想删除它们。它们并不总是出现在列表的前三项中,我需要一种很好的方式来处理它们或者首先找出它们为什么存在。
>>>print columns[0]
Mag8�
>>>columns[0]
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
>>>repr(columns[0])
"'MagX\\x00\\x00\\x00\\x08\\x01\\x008\\xe6\\x7f'"
>>>print repr(columns[0])
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
我尝试使用正则表达式删除十六进制值,但运气不佳。
>>>re.sub('(\w*)\\\\x.*', '\1', columns[0])
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
>>>re.sub('(\w*)\\\\x.*', r'\1', columns[0])
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
>>>re.sub(r'(\w*)\\x.*', '\1', columns[0])
'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f'
>>>re.sub('([A-Za-z]*)\x00', r'\1', columns[0])
'MagX\x08\x018\xe6\x7f'
>>>re.sub('(\w*?)', '\1', columns[0])
'\x01M\x01a\x01g\x01X\x01\x00\x01\x00\x01\x00\x01\x08\x01\x01\x01\x00\x018\x01\xe6\x01\x7f\x01'
有关如何处理此事的任何建议吗?
答案 0 :(得分:7)
您可以通过以下方式删除所有非单词字符:
>>> re.sub(r'[^\w]', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f')
'MagX8'
正则表达式[^\w]
将匹配任何非字母,数字或下划线的字符。通过在re.sub
中使用空字符串作为替换提供正则表达式,您将删除字符串中的所有其他字符。
由于您可能希望保留其他字符,因此更好的解决方案可能是指定要保留的更大范围的字符,以排除控制字符。例如:
>>> re.sub(r'[^\x20-\x7e]', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f')
'MagX8'
或者您可以将[^\x20-\x7e]
替换为等效的[^ -~]
,具体取决于哪个更清楚。
要在第一个控制字符后排除所有字符,只需添加.*
,如下所示:
>>> re.sub(r'[^ -~].*', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f')
'MagX'
答案 1 :(得分:1)
它们实际上并不在字符串中:您有未转义的控制字符,Python使用十六进制表示法显示 - 这就是您在打印值时看到不寻常符号的原因。
你应该只是能够删除正则表达式中额外的引用级别,但你也可能只是依赖于regexp模块的通用空格类,它将匹配除制表符和空格之外的空白字符:
>>> import re
>>> re.sub(r'\s', '?', "foo\x00bar")
'foo\x00bar'
>>> print re.sub(r'\s', '?', "foo\x00bar")
foobar
我使用这一个来替换所有输入空格运行,包括不间断的空格字符,只有一个空格:
>>> re.sub(r'[\xa0\s]+', ' ', input_str)
答案 2 :(得分:0)
您也可以在不导入re
的情况下执行此操作。例如。如果你满足于只保留ascii字符:
good_string = ''.join(c if ord(c) < 129 else '?' for c in bad_string)