【发布时间】:2013-08-21 10:58:45
【问题描述】:
我有下一个输入字符串:
ANIM "_NAME_KEY_" // Index = 26, AFrames = 1
{
0x301C
AF 0x201C 1 0 0 FREE_ROTATE 0 FREE_SCALE_XY 100 100
}
我怎样才能在两个花括号之间得到整个字符串,只有 _NAME_KEY_ ?
【问题讨论】:
我有下一个输入字符串:
ANIM "_NAME_KEY_" // Index = 26, AFrames = 1
{
0x301C
AF 0x201C 1 0 0 FREE_ROTATE 0 FREE_SCALE_XY 100 100
}
我怎样才能在两个花括号之间得到整个字符串,只有 _NAME_KEY_ ?
【问题讨论】:
使用选项re.MULTILINE 作为 re.compile/etc 的第二个参数。打电话。
我会建议这个正则表达式:_NAME_KEY_[^{]*+\{([^}]+)\}
说明:
_NAME_KEY_:匹配“_NAME_KEY_”
[^{]*:匹配尽可能多的非{字符(贪婪)
\{:匹配一个{字符
([^}]+):匹配(并捕获)非}字符(贪婪)
\}: 匹配一个 } 字符
【讨论】:
query = "ANIM \"" + _KEY_NAME_ + "\".*(\s*)" + "{(\s*\w){2}\s*}" match = re.search(query, self.content, re.MULTILINE),但它只在花括号内使用 2 行。
MULTILINE 选项只会改变锚点的行为,^ 和 $。您没有使用锚点,因此 MULTILINE 无关紧要。
MULTILINE 与点匹配的内容不相关吗? 编辑: 对。我没有使用点。好的,你是对的。
re.findall(r'(?<={)[^}]*',str)
例如
In [5]: x="""ANIM "_NAME_KEY_" // Index = 26, AFrames = 1
{
0x301C
AF 0x201C 1 0 0 FREE_ROTATE 0 FREE_SCALE_XY 100 100
}"""
In [6]: import re
In [7]: re.findall(r'(?<={)[^}]*',x)
Out[7]: ['\n 0x301C\n AF 0x201C 1 0 0 FREE_ROTATE 0 FREE_SCALE_XY 100 100\n ']
【讨论】:
使用:
_NAME_KEY_[^{]*\{([^}]*)}
结果在第一个捕获组中。您不需要使用 dotall 模式,因为此模式不使用点。
顺便说一句,您可以像这样修剪空白:
_NAME_KEY_[^{]*\{\s*([^}]*?)\s*}
【讨论】: