如何使用正则表达式删除python字符串中的十六进制值?

moo*_*nts 3 python string matlab hdf5 pytables

我在matlab中有一个单元格数组

columns = {'MagX', 'MagY', 'MagZ', ...
           'AccelerationX',  'AccelerationX',  'AccelerationX', ...
           'AngularRateX', 'AngularRateX', 'AngularRateX', ...
           'Temperature'}
Run Code Online (Sandbox Code Playgroud)

我使用这些脚本,利用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']
Run Code Online (Sandbox Code Playgroud)

这些十六进制值从某处弹出到字符串中,我想删除它们.它们并不总是出现在列表的前三项中,我需要一种很好的方式来处理它们或者首先找出它们为什么存在.

>>>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'
Run Code Online (Sandbox Code Playgroud)

我尝试使用正则表达式删除十六进制值,但运气不佳.

>>>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'
Run Code Online (Sandbox Code Playgroud)

有关如何处理这个的任何建议?

And*_*ark 7

您可以通过以下方式删除所有非单词字符:

>>> re.sub(r'[^\w]', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f')
'MagX8'
Run Code Online (Sandbox Code Playgroud)

正则表达式[^\w]将匹配任何不是字母,数字或下划线的字符.通过re.sub使用空字符串作为替换提供该正则表达式,您将删除字符串中的所有其他字符.

由于您可能希望保留其他字符,因此更好的解决方案可能是指定要保留的更大范围的字符,以排除控制字符.例如:

>>> re.sub(r'[^\x20-\x7e]', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f')
'MagX8'
Run Code Online (Sandbox Code Playgroud)

或者您可以[^\x20-\x7e]使用等效替换[^ -~],具体取决于您对此更清楚.

要在第一个控制字符后排除所有字符,只需添加一个.*,如下所示:

>>> re.sub(r'[^ -~].*', '', 'MagX\x00\x00\x00\x08\x01\x008\xe6\x7f')
'MagX'
Run Code Online (Sandbox Code Playgroud)