我有一个用例,需要在任意两个字符之间识别许多不同的文本。
例如,
- 单个空间和
(
之间的字符串:def test()
将返回test
- 单词和空间之间的字符串(
paste
(和特殊字符(/
(:@paste "game_01/01"
将返回"game_01
- 单个空间与
(
之间的字符串具有多个目标字符串:} def test2() { Hello(x, 1)
将返回test2
和Hello
为此,我正在尝试编写一些通用的东西,以识别任何两个字符之间的最短字符串。
我当前的方法是(来自 Chrisz (:
pattern = '{0}(.*?){1}'.format(re.escape(separator_1), re.escape(separator_2))
对于第一种用例,separator_1 = s
和separator_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的最短长度字符串。