我有以下正则表达式,用于在字符串中查找“IF”关键字(不区分大小写)。施加了一些限制:
以下表达式实现了这些约束。但是,当表达式位于字符串的开头(例如if(foo, 1, 2)
)时,此表达式找不到关键字。
使用像^|(?<=[\s\)])(?i)if(?=[\s\(])
这样的东西似乎不起作用。我尝试?:^|[\s\)])
,但似乎也捕获了关键字前面的空格。
这是我到目前为止所做的:
(?<=[\s\)])(?i)if(?=[\s\(])
答案 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)])
(不是前面没有空格或右括号的字符)。这个条件也包括字符串的开头。