3

matlabにセル配列があります

columns = {'MagX', 'MagY', 'MagZ', ...
           'AccelerationX',  'AccelerationX',  'AccelerationX', ...
           'AngularRateX', 'AngularRateX', 'AngularRateX', ...
           'Temperature'}

matlabのhdf5write関数を使用して配列をhdf5形式で保存するこれらのスクリプトを使用します。

次に、pytablesを使用してhdf5ファイルをpythonに読み込みます。セル配列は、文字列の多数の配列として提供されます。リストに変換すると、これが出力になります。

>>>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']

これらの16進値はどこかから文字列にポップインするので、削除したいと思います。それらはリストの最初の3つの項目に常に表示されるとは限らないので、それらに対処したり、そもそもなぜそこにあるのかを知るための良い方法が必要です。

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

正規表現を使用して16進値を削除しようとしましたが、うまくいきませんでした。

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

これに対処する方法について何か提案はありますか?

4

3 に答える 3

9

次の方法で、単語以外のすべての文字を削除できます。

>>> 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'
于 2011-03-04T19:08:21.393 に答える
1

これらは実際には文字列に含まれていません。エスケープされていない制御文字があり、Pythonは16進表記を使用して表示します。そのため、値を出力すると異常な記号が表示されます。

正規表現の余分なレベルの引用符を削除できるはずですが、タブやスペース以外の空白文字と一致する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)
于 2011-03-04T19:10:42.963 に答える
0

をインポートせずにこれを行うこともできますre。たとえば、ASCII文字のみを保持することに満足している場合:

good_string = ''.join(c if ord(c) < 129 else '?' for c in bad_string)

于 2016-04-07T06:15:57.123 に答える