Regex谜题:只有在两个$$之间才匹配一个模式,而不需要无限期地向后看



我正在为Vim插件UltiSnips编写一个片段,它将在正则表达式模式上触发(Python 3支持(。为了避免冲突,我想确保我的代码片段只有在包含在$$___$$内部时才会触发。请注意,触发器模式可能在其前面或后面包含一个不确定字符串;a";在"$$ccbbabbcc$$";但不是";ccbbabbcc";。显然,如果我可以简单地使用不确定的向后看,这将是微不足道的。唉,我可能不会,因为这不是.NET和普通Python不允许的。有标准的方法来实现这种表达式吗?请注意,我将无法使用任何python函数。表达式必须是自包含的触发器。

如果您要查找的内容在"$$"之间只出现一次,则:

$$.*?(a)(?=.*?$$)

这允许您匹配以下示例中的所有3个a字符:

  1. $$)匹配"$$">
  2. .*?非贪婪地匹配0个或多个字符
  3. (?=.*?$$)字符串后面必须跟0个或多个任意字符,然后跟"$$">

代码:

import re
s = "$$ccbbabbcc$$xxax$$bcaxay$$"
print(re.findall(r'$$.*?(a)(?=.*?$$)', s))

打印:

['a', 'a', 'a']

以下内容应该有效:

re.findall("${2}.+${2}", stuff)

细分:

寻找两个'$'

"${2}

然后查找任意字符中的一个或多个

.+

然后再次寻找两个"$">

我相信这个正则表达式可以在$$:中匹配a

text = '$$ccbbabbcc$$ccbbabbcc'
re.findall('${2}.*(a).*${2}', text)
# prints
['a']

或者:

一个简单的方法(需要两个检查而不是一个正则表达式(是首先找到引用文本中包含的所有部分,然后检查搜索字符串是否存在于中。

示例

text = '$$ccbbabbcc$$ccbbabbcc'
search_string = 'a'
parts = re.findall('${2}.+${2}', text)
[p for p in parts if search_string in p]
# prints
['$$ccbbabbcc$$']

相关内容

  • 没有找到相关文章

最新更新