我有一个包含类似内容的文件
#comment
#comment
不是评论#comment
#comment
不是评论
我试图逐行读取文件,只捕获不以#开头的行.我的代码/正则表达式出了什么问题?
import re
def read_file():
pattern = re.compile("^(?
原始代码捕获所有内容而不是预期.
1> Iron Fist..:
另一种简单的方法是仅检查char
您读取的每行中的第一行是否包含#
字符:
def read_file():
with open('list') as f:
for line in f:
if not line.lstrip().startswith('#'):
print line
也许通过使用`line.lstrip().startswith("#")`来使它变得更加防弹,以防该行在`#`之前有空格.@Mico:你使用*lookbehind*断言而不是*lookahead*断言.Lookbehind在行开头之前看到换行符,而不是行开头后的`#`字符.
2> Mike Covingt..:
铁拳显示你应该这样做的方式; 但是,如果你想知道你的正则表达式有什么问题,应该是这样的:
^[^#].*
说明:
^
- 匹配行的开头.
[^#]
- 匹配不是的东西#
.[^...]
是你怎么说不匹配的东西(只需替换...
你不想匹配的任何字符.例如,[^ABC123]
将匹配一个不是A,B,C,1,2或3的字符.不要让^
这表示一行/字符串的开头让你感到困惑.这两者^
完全无关.
.*
- 匹配零或更多的其他东西.
编辑:
原因^(?是不区分# comment
和not a comment
是在当前位置之前(?检查文本.引擎在字符串开始后的第一个符号之前查找,并且因为在字符串开始之前没有,所以任何行都与子模式匹配.要真正检查第一个符号是否是,您只需要使用正则表达式.或者,如果可以有前导空格,.#
#
.*
#
^#.*
^\s*#
@MikeCovington:这是一个错误的解释.