用于解析sfv格式文件的正则表达式

时间:2012-11-01 12:52:20

标签: python regex file parsing verification

我正在尝试编写一个正则表达式来解析python中的sfv文件。 基本上,这些行的格式为

  

filename crc_bytes

但可以在整个地方添加空格,包括文件名。所以真正的格式是

  

(空格)文件名(空格)crc_bytes(空格)

当文件名可以包含空格时。

现在,我正在尝试提取filename和crc_bytes。所以我试过了:

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

但它解析了

'   filename with spaces    crc  '

as

'filename with spaces   ', 'crc' 

//太多空格------------ ^

知道如何摆脱这些空间吗?可能,以某种方式看后面?

奖金问题:

sfv文件中的注释是以';'开头的行。如果有人能够在正则表达式中处理评论,我将永远负债。

谢谢!

1 个答案:

答案 0 :(得分: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]

现在我们有三行,其中两行是注释行。以下内容仅解析不是注释的行:

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