【问题标题】:Negative lookbehind in Python regular expressionsPython 正则表达式中的负向回溯
【发布时间】:2010-10-20 16:36:34
【问题描述】:

我正在尝试使用 python 从文件中解析数据列表 - 但是我不想提取任何被注释掉的数据。数据结构方式的一个示例是:

#commented out block
uncommented block
#   commented block

我试图只检索中间项目,所以我试图在开始时排除带有散列的项目。问题是一些散列直接在被评论的项目旁边,而一些则不是,我目前的表达只有在上面的第一个例子中被评论的项目才有效-

(?<!#)(commented)

我尝试将 \s+ 添加到负前瞻中,但随后我收到一个抱怨,即表达式没有明显的最大长度。有什么办法可以做我想做的事吗?

提前致谢,

【问题讨论】:

  • 也许你只需要像^([^#].*)这样的东西

标签: python regex string


【解决方案1】:

为什么要使用正则表达式?字符串方法就可以了:

>>> s = """#commented out block
uncommented block
#   commented block
""".splitlines()
>>> for line in s:
    not line.lstrip().startswith('#')


False
True
False

【讨论】:

  • +1 正则表达式非常棒......对于某些问题。对于其他人来说,有更好(而且不那么神秘)的解决方案;)
  • +1:为工作使用正确的工具。并不总是需要拿出大锤。
  • 我最终结合了正则表达式搜索,然后在开始时检查 #s 的结果。我只想提取包含某些位的文件的某些部分,因此我使用正则表达式来搜索这些部分。
【解决方案2】:

正如 SilentGhost 所指出的,正则表达式并不是解决这个问题的最佳方法,但我想我会解决背后的负面看法。

你想过这样做:

(?<!#\s+)(commented)

这不起作用,因为后面的外观需要有限的长度。你可以这样做:

(?<!#)(\s+commented)

这将匹配您想要的行,但当然,您必须从注释组中去除空格。再说一次,字符串操作更适合您正在做的事情,但我想说明您提出的问题后负面外观如何起作用。

【讨论】:

    【解决方案3】:
    >>> s = """#commented out block
    ... uncommented block
    ...    #   commented block
    ... """
    >>> for i in s.splitlines():
    ...    if not i.lstrip().startswith("#"):
    ...       print i
    ...
    uncommented block
    

    【讨论】:

      猜你喜欢
      • 2012-12-06
      • 2017-08-23
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多