我正在尝试编写一个正则表达式来解析python中的sfv文件。 基本上,这些行的格式为
filename crc_bytes
但可以在整个地方添加空格,包括文件名。所以真正的格式是
(空格)文件名(空格)crc_bytes(空格)
当文件名可以包含空格时。
现在,我正在尝试提取filename和crc_bytes。所以我试过了:
'\s*(.+)\s+([^\s]+)'
但它解析了
' filename with spaces crc '
as
'filename with spaces ', 'crc'
//太多空格------------ ^
知道如何摆脱这些空间吗?可能,以某种方式看后面?
sfv文件中的注释是以';'开头的行。如果有人能够在正则表达式中处理评论,我将永远负债。
谢谢!
答案 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')]