0

Pythonでsfvファイルを解析するための正規表現を作成しようとしています。基本的に、行は次の形式です

ファイル名crc_bytes

ただし、ファイル名を含め、どこにでも空白を追加できます。したがって、実際の形式は

(空白)ファイル名(空白)crc_bytes(空白)

ファイル名に空白を含めることができる場合。

今、私はファイル名とcrc_bytesを抽出しようとしています。だから私は試しました:

'\s*(.+)\s+([^\s]+)'

しかし、それは解析されました

'   filename with spaces    crc  '

なので

'filename with spaces   ', 'crc' 

//スペースが多すぎます------------^

これらのスペースを取り除く方法はありますか?おそらく、何とか後ろを振り返る?

ボーナス質問:

sfvファイルのコメントは、「;」で始まる行です。誰かが正規表現でコメントを処理できるとしたら、私は永遠に彼の借金を負います。

ありがとう!!

4

1 に答える 1

0

スペースを含むファイル名の処理

を使用(.+\S)すると、ファイル名が非空白文字 ( '\S) で終わるように強制されます。

>>> import re
>>> reg=re.compile('\s*(.+\S)\s+(\S+)')
>>> reg.findall(line)
[('filename with spaces', 'crc')]

コメントを避ける

先読みを使用するか、正規表現に否定チェックを追加できます。ただし、別の正規表現を追加すると読みやすくなると思います。

>>> comment_line_regex=re.compile('\s*;.*')
>>> line1='   filename with spaces    crc  '
>>> line2=';  filename with spaces    crc  '
>>> line3='  ;  filename with spaces    crc  '
>>> lines = [line1, line2, line3]

これで 3 行になり、そのうちの 2 行はコメント行です。以下は、コメントではない行のみを解析します。

>>> [reg.findall(l) for l in lines if not comment_line_regex.match(l)]
[[('filename with spaces', 'crc')]]

または、より冗長な方法で:

>>> for line in lines:
...     if not comment_line_regex.match(line):
...             print reg.findall(line)
... 
[('filename with spaces', 'crc')]
于 2012-11-01T13:00:50.250 に答える