我正在为Vim插件UltiSnips编写一个片段,它将在正则表达式模式上触发(Python 3支持(。为了避免冲突,我想确保我的代码片段只有在包含在$$___$$内部时才会触发。请注意,触发器模式可能在其前面或后面包含一个不确定字符串;a";在"$$ccbbabbcc$$";但不是";ccbbabbcc";。显然,如果我可以简单地使用不确定的向后看,这将是微不足道的。唉,我可能不会,因为这不是.NET和普通Python不允许的。有标准的方法来实现这种表达式吗?请注意,我将无法使用任何python函数。表达式必须是自包含的触发器。
如果您要查找的内容在"$$"之间只出现一次,则:
$$.*?(a)(?=.*?$$)
这允许您匹配以下示例中的所有3个a
字符:
$$)
匹配"$$">.*?
非贪婪地匹配0个或多个字符(?=.*?$$)
字符串后面必须跟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$$']