Python正则表达式中的负向后视
我正在用Python从一个文件中提取数据列表,但我不想提取被注释掉的数据。数据的结构大致是这样的:
#commented out block
uncommented block
# commented block
我只想获取中间的那个项目,所以我想排除那些开头有井号(#)的项目。问题是,有些井号和被注释的项目紧挨着,有些则没有,而我现在用的表达式只在第一个例子中能正常工作——
(?<!#)(commented)
我尝试在负向前瞻中添加\s+,但然后就出现了一个错误,提示这个表达式没有明显的最大长度。我有没有办法做到我想做的事情?
提前谢谢你,
丹
3 个回答
0
>>> s = """#commented out block
... uncommented block
... # commented block
... """
>>> for i in s.splitlines():
... if not i.lstrip().startswith("#"):
... print i
...
uncommented block
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。
4
正如SilentGhost所说,正则表达式并不是解决这个问题的最佳方法,但我想谈谈负向前查找。
你想这样做:
(?<!#\s+)(commented)
这样做是不行的,因为负向前查找需要一个有限的长度。你可以尝试这样:
(?<!#)(\s+commented)
这样可以匹配到你想要的行,但当然,你还需要去掉注释部分的空格。再说一次,字符串处理在你要做的事情上更合适,但我想展示一下负向前查找是怎么工作的,因为你在问这个。
6
为什么要使用正则表达式呢?其实字符串的方法就已经足够用了:
>>> s = """#commented out block
uncommented block
# commented block
""".splitlines()
>>> for line in s:
not line.lstrip().startswith('#')
False
True
False