Python正则表达式中的负面lookbehind

时间:2010-10-20 16:36:35

标签: python regex string

我正在尝试使用python解析文件中的数据列表 - 但是我不想提取任何已注释掉的数据。数据结构的一个例子是:

#commented out block
uncommented block
#   commented block

我正在尝试仅检索中间项目,因此我尝试在开始时排除带有哈希的项目。问题是一些哈希值直接在注释项目旁边,有些哈希值,并且我目前只有在上面第一个例子中注释了项目时才能使用表达式 -

(?<!#)(commented)

我尝试将\ s +添加到否定前瞻但后来我抱怨表达式没有明显的最大长度。有没有办法做我想做的事情?

提前致谢,

3 个答案:

答案 0 :(得分:6)

为什么要使用正则表达式?字符串方法就可以了:

>>> s = """#commented out block
uncommented block
#   commented block
""".splitlines()
>>> for line in s:
    not line.lstrip().startswith('#')


False
True
False

答案 1 :(得分:4)

正如SilentGhost所指出的那样,正则表达式并不是解决这个问题的最佳方法,但我认为我会解决背后的负面看法。

你想过这样做:

(?<!#\s+)(commented)

这不起作用,因为背后的外观需要有限的长度。你可以这样做:

(?<!#)(\s+commented)

这会匹配您想要的行,但当然,您必须从注释组中删除空格。再一次,字符串操作对于你正在做的事情来说更好,但是我想展示一下自从你提出要求后,负面看起来是如何工作的。

答案 2 :(得分:0)

>>> s = """#commented out block
... uncommented block
...    #   commented block
... """
>>> for i in s.splitlines():
...    if not i.lstrip().startswith("#"):
...       print i
...
uncommented block