Python正则表达式中的负向后视

2 投票
3 回答
2197 浏览
提问于 2025-04-16 05:48

我正在用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

撰写回答