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]

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

>>> [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 回答