Python:不以开头的行#

Python:不以开头的行#,python,regex,Python,Regex,我有一个包含如下内容的文件 #评论 #评论 无可奉告 #评论 #评论 无可奉告 我试图逐行读取文件,只捕获不以#开头的行。我的代码/正则表达式有什么问题 重新导入 def read_文件(): pattern=re.compile(“^(?另一种简单的方法是只检查您读取的每行的第一个字符是否不包含#字符: def read_file(): with open('list') as f: for line in f: if not line.lst

我有一个包含如下内容的文件

#评论
#评论
无可奉告

#评论
#评论
无可奉告

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

重新导入
def read_文件():

pattern=re.compile(“^(?另一种简单的方法是只检查您读取的每行的第一个
字符是否不包含
#
字符:

def read_file():

    with open('list') as f:
        for line in f:
            if not line.lstrip().startswith('#'):
                print line
显示了您可能应该这样做的方式;但是,如果您想知道您的正则表达式到底出了什么问题,应该是这样的:

^[^#].*
说明:

  • ^
    -匹配行首
  • [^#]
    -匹配不匹配的内容
    [^…]
    就是你说不匹配的方式(只要用你不想匹配的字符替换
    ..
    。例如,
    [^ABC123]
    将匹配一个不是a、B、C、1、2或3的字符。请不要让指示行/字符串开头的
    ^
    在此处混淆。这两个
    ^
    完全无关
  • *
    -匹配零或更多其他内容
编辑:


^(?不区分
#comment
非comment
的原因是
(?检查当前位置之前的文本。引擎在字符串开头后的第一个符号之前查找
#
,并且由于在字符串开头之前没有
#
,因此任何行都与
*
子模式匹配。要真正检查第一个符号是否为
#
,只需使用
^.
reg例如,如果可能有前导空格,
^\s*#
在这种情况下使用
匹配
函数,因为它将在开头检查

所以表达式将是
\s*[^#]
——为了保持理智,我使用
\s
传递空格

OP的代码将是-

def read_file():
    pattern = re.compile("\s*[^#]")
    with open(r"C:\test.txt") as f:
        for line in f:
            if pattern.match(line):
                    print line
read_file()
编辑-

解释一下为什么OP的模式不起作用-

当你使用
时,它意味着除了换行符以外的所有字符。所以当你写
^(?它意味着
任何
字符(除了换行符-它包括
.
该死!)之前没有
的字符,最终它变成任何字符串(除了换行符变体)以
任何
字符开头

解决方案:

尝试像
^(?

那样否定
,因为:

(?!#)
NegativeLookahead-断言不可能匹配下面的正则表达式
(?Negativelookback-断言不可能匹配正则表达式
#

哪个来自regex101

这意味着它只匹配后面的
。所以我的意思是:

>>> re.search('foo(?!bar)', 'foobar')
>>> re.search('foo(?<!bar)', 'foobar')  # doesn't work
<_sre.SRE_Match object; span=(0, 3), match='foo'>


>>> re.search('(?<!bar)foo', 'barfoo')
>>> re.search('(?!bar)foo', 'barfoo')   # doesn't work
<_sre.SRE_Match object; span=(3, 6), match='foo'>
重新搜索('foo(?!bar)'foobar') >>>再搜索('foo(?)? >>>重新搜索('(?)?
因为你用错了代币,所以答案很简单:

如果
条后不需要字符串,请使用
(?!bar)

使用
(?如果您不想在
栏前面加上一些字符串


lookback检查当前位置之前的内容,lookahead检查当前位置之后的内容。如果确实需要正则表达式,请使用lookahead。但此处并不真正需要正则表达式。是否必须使用
regex
ode>但我认为OP是在问为什么
^(?在这种情况下不起作用,而不是怎么做。是的。我想这一个是有效的。但是你知道正则表达式为什么不起作用吗?也许可以通过使用
line.lstrip().startswith(#)使它更加防弹
以防该行在
#
之前有空格@Mico:您使用的是一个lookbehind断言而不是lookbehind断言。lookbehind看到的是行首之前的换行符,而不是行首之后的
字符。@KevinGuan。Thanks@IronFist谢谢你展示了正确的答案很好。@Stribizev怎么会这样?我当然不是负面情绪断言方面的专家。请纠正我。请看我对问题的评论。第一个。@Stribizev但我的答案到底有什么问题。我看不出任何问题。*是贪婪的,与包括#或#评论在内的整行内容相匹配。负面的后面看驴是不相关的谢谢,为什么答案以“因为”开头?