这个问题在这里已有答案:
我有一个用例,需要在任意两个字符之间识别许多不同的文本。
例如,
(
之间的字符串: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
要添加解释,请执行以下操作:
返回字符串中pattern的所有非重叠匹配,作为字符串列表
除ASCII字母和数字外,转义模式中的所有字符。如果要匹配可能包含正则表达式元字符的任意文字字符串,这将非常有用
.*?
匹配任何字符(行终止符除外)
*?
Quantifier - 在零和无限次之间匹配,尽可能少,根据需要扩展(懒惰)
因此,我们的正则表达式匹配两个任意转义字符串之间的任何字符(不包括行终止符),然后返回list
返回的re.findall()
中的最短长度字符串。