正则表达式拼图:仅当模式在两个$$之间且无不确定的后面时才匹配该模式

问题描述

我正在为Vim插件UltiSnips编写一个片段,该片段将以正则表达式模式触发(Python 3支持)。为了避免冲突,我想确保仅在包含在$$ ___ $$内的某个位置时触发我的代码段。请注意,触发模式可能在其前面或后面包含不确定的字符串。因此,举例来说,我可能想匹配“ $$ ccbbabbcc $$”中的所有“ a”,而不是“ ccbbabbcc”。显然,如果我可以简单地在后面使用不确定的外观,这将是微不足道的。 las,我可能不是,因为这不是.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}

然后寻找任何一个或多个字符

.+

然后再次寻找两个'$'

,

我相信此正则表达式可以匹配drag中的a

$$

或者:

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

示例

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