Python/Regex:在任意两个字符之间获取所有字符串



我有一个用例,需要在任意两个字符之间识别许多不同的文本。

例如,

  1. 单个空间和(之间的字符串:def test()将返回 test
  2. 单词和空间之间的字符串(paste(和特殊字符(/(:@paste "game_01/01"将返回"game_01
  3. 单个空间与(之间的字符串具有多个目标字符串:} def test2() { Hello(x, 1)将返回test2Hello

为此,我正在尝试编写一些通用的东西,以识别任何两个字符之间的最短字符串。

我当前的方法是(来自 Chrisz (:

pattern = '{0}(.*?){1}'.format(re.escape(separator_1), re.escape(separator_2))

对于第一种用例,separator_1 = sseparator_2 = (。这显然不是如此,我缺少一些东西,但不确定是什么。

tl; dr 如何编写通用正则以解析任何两个字符之间的最短字符串?

  • 注意:我知道有很多例子,但是它们似乎很具体,如果可能的话,我正在寻找一个通用解决方案。

让我知道这是否是您要寻找的:

import re
def smallest_between_two(a, b, text):
    return min(re.findall(re.escape(a)+"(.*?)"+re.escape(b),text), key=len)
print(smallest_between_two(' ', '(', 'def test()'))
print(smallest_between_two('[', ']', '[this one][not this one]'))
print(smallest_between_two('paste ', '/', '@paste "game_01/01"'))

输出:

test
this one
"game_01

添加说明的说明:

re.findall()

返回字符串中的所有非重叠匹配,作为字符串列表

re.escape()

除了ASCII字母和数字外,逃脱了模式中的所有字符。如果您想匹配一个任意文字字符串,该字符串可能在其中具有正则表达式元素

(.*?)

.*?匹配任何字符(线终结者除外(

*?量词 - 尽可能少的次数匹配零和无限时间,根据需要扩展(lazy(

因此,我们的正则表达式匹配两个任意逃脱字符串之间的任何字符(不包括线终止器(,然后返回list返回的CC_19的最短长度字符串。

最新更新