0

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

4

3 回答 3

1

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

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

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

  1. \$\$)匹配“$$”
  2. .*?非贪婪地匹配 0 个或多个字符
  3. (?=.*?\$\$)字符串必须后跟 0 个或多个任意字符,后跟 '$$'

编码:

import re

s = "$$ccbbabbcc$$xxax$$bcaxay$$"

print(re.findall(r'\$\$.*?(a)(?=.*?\$\$)', s))

印刷:

['a', 'a', 'a']
于 2020-08-13T15:17:17.857 回答
0

以下应该有效:

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

分解:

寻找两个'$'

"\${2}

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

.+

然后再次寻找两个'$'

于 2020-08-13T14:39:57.660 回答
0

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$$']
于 2020-08-13T14:51:37.807 回答