Python正则表达式:替代正面的lookbehind断言

时间:2016-12-14 23:13:42

标签: python regex

我有以下正则表达式,用于在字符串中查找“IF”关键字(不区分大小写)。施加了一些限制:

  • 前面应加一个空格或a)字符(来自前一个表达式)
  • 后面应该是空格或(字符

以下表达式实现了这些约束。但是,当表达式位于字符串的开头(例如if(foo, 1, 2))时,此表达式找不到关键字。

使用像^|(?<=[\s\)])(?i)if(?=[\s\(])这样的东西似乎不起作用。我尝试?:^|[\s\)]),但似乎也捕获了关键字前面的空格。

这是我到目前为止所做的:

(?<=[\s\)])(?i)if(?=[\s\(])

3 个答案:

答案 0 :(得分:1)

您可以使用具有两个零宽度断言的交替组:

(?i)(?:^|(?<=[\s)]))if(?=[\s(])
    ^^^^^^^^^^^^^^^^

请参阅regex demo

此处(?:^|(?<=[\s)]))匹配:

  • ^ - 字符串开头
  • | - 或
  • (?<=[\s)]) - 紧接着以空格或)字符开头的位置。

请注意,Python (?i)正则表达式中的re内联不区分大小写修饰符会影响整个模式,无论它位于何处,因此我建议将其移至模式开始以获得更好的可见性。

此外,不需要在字符类(构造内部转义)[...],因为它们被视为其中的字面括号。

答案 1 :(得分:1)

问题是|应用于顶层,因此它是以下之间的变化: ^(?<=[\s\)])(?i)if(?=[\s\(])

只需在^(?<=[\s\)])附近添加非捕获组:

(?:^|(?<=[\s\)]))(?i)if(?=[\s\(])

答案 2 :(得分:1)

您可以使用双重否定来解决问题(对于这种仅涉及单个字符的特殊情况):

(?<![^\s)])

(不是前面没有空格或右括号的字符)。这个条件也包括字符串的开头。