问题描述
我正在为Vim插件UltiSnips编写一个片段,该片段将以正则表达式模式触发(Python 3支持)。为了避免冲突,我想确保仅在包含在$$ ___ $$内的某个位置时触发我的代码段。请注意,触发模式可能在其前面或后面包含不确定的字符串。因此,举例来说,我可能想匹配“ $$ ccbbabbcc $$”中的所有“ a”,而不是“ ccbbabbcc”。显然,如果我可以简单地在后面使用不确定的外观,这将是微不足道的。 las,我可能不是,因为这不是.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}
然后寻找任何一个或多个字符
.+
然后再次寻找两个'$'
,我相信此正则表达式可以匹配drag
中的a
:
$$
或者:
一种简单的方法(需要两次检查而不是一个正则表达式)是首先查找引号文本中包含的所有部分,然后检查搜索字符串是否存在。
示例
text = '$$ccbbabbcc$$ccbbabbcc'
re.findall('\${2}.*(a).*\${2}',text)
# prints
['a']