Python:不以#开头的行

Mic*_*ico 11 python regex

我有一个包含类似内容的文件

#comment
#comment
不是评论

#comment
#comment
不是评论

我试图逐行读取文件,只捕获不以#开头的行.我的代码/正则表达式出了什么问题?

import re

def read_file():
    pattern = re.compile("^(?<!# ).*")

    with open('list') as f:
        for line in f:
            print pattern.findall(line)
Run Code Online (Sandbox Code Playgroud)

原始代码捕获所有内容而不是预期.

Iro*_*ist 13

另一种简单的方法是仅检查char您读取的每行中的第一行是否包含#字符:

def read_file():

    with open('list') as f:
        for line in f:
            if not line.lstrip().startswith('#'):
                print line
Run Code Online (Sandbox Code Playgroud)

  • 也许通过使用`line.lstrip().startswith("#")`来使它变得更加防弹,以防该行在`#`之前有空格.@Mico:你使用*lookbehind*断言而不是*lookahead*断言.Lookbehind在行开头之前看到换行符,而不是行开头后的`#`字符. (4认同)

Mik*_*ton 11

铁拳显示你应该这样做的方式; 但是,如果你想知道你的正则表达式有什么问题,应该是这样的:

^[^#].*
Run Code Online (Sandbox Code Playgroud)

说明:

  • ^ - 匹配行的开头.
  • [^#]- 匹配不是的东西#.[^...]是你怎么说不匹配的东西(只需替换...你不想匹配的任何字符.例如,[^ABC123]将匹配一个不是A,B,C,1,2或3的字符.不要让^这表示一行/字符串的开头让你感到困惑.这两者^完全无关.
  • .* - 匹配零或更多的其他东西.

编辑:

原因^(?<!# ).*是不区分# commentnot a comment是在当前位置之前(?<!#)检查文本.引擎在字符串开始后的第一个符号之前查找,并且因为在字符串开始之前没有,所以任何行都与子模式匹配.要真正检查第一个符号是否是,您只需要使用正则表达式.或者,如果可以有前导空格,.##.*#^#.*^\s*#

  • @MikeCovington:这是一个错误的解释. (2认同)