Python / Regex:获取任意两个字符之间的所有字符串[重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

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

例如,

  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如何编写通用正则表达式来解析任意两个字符之间的最短字符串?

  • 注意:我知道有很多这样的例子,但它们看起来非常具体,如果可能的话,我正在寻找一个通用的解决方案。
python regex
1个回答
3
投票

如果您正在寻找,请告诉我:

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()

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

re.escape()

除ASCII字母和数字外,转义模式中的所有字符。如果要匹配可能包含正则表达式元字符的任意文字字符串,这将非常有用

(.*?)

.*?匹配任何字符(行终止符除外)

*? Quantifier - 在零和无限次之间匹配,尽可能少,根据需要扩展(懒惰)

因此,我们的正则表达式匹配两个任意转义字符串之间的任何字符(不包括行终止符),然后返回list返回的re.findall()中的最短长度字符串。

© www.soinside.com 2019 - 2024. All rights reserved.