具有特定空白间距的大括号前字符串的正则表达式
Regex for string before curly brackets with specific white-spacing
我非常不擅长正则表达式,这几天一直在用头撞墙。我正在尝试使用 Python 从 .nk nuke 脚本中提取信息。格式如下:
> BackdropNode {
inputs 0
name BackdropNode6
tile_color 0x555555ff
label RDN
note_font_size 42
xpos -1136
ypos -4272
bdwidth 451
bdheight 529
}
Write {
file "\[value project_directory]/_output_/\[string range \[file tail \[value root.name]] 0 20].mov"
colorspace sRGB
raw true
file_type mov\{(.*?)\}
mov64_format "mov (QuickTime / MOV)"
mov64_codec AVdh
mov64_dnxhd_codec_profile "DNxHD 422 8-bit 145Mbit"
mov64_dnxhr_codec_profile "SQ 4:2:2 8-bit"
mov64_pixel_format {{0} "yuv420p\tYCbCr 4:2:0 8-bit"}
mov64_quality High
mov64_advanced 1
mov64_write_timecode true
mov64_gop_size 12
mov64_b_frames 0
mov64_bitrate 20000
mov64_bitrate_tolerance 40000000
mov64_quality_min 2
mov64_quality_max 31
render_order 3
checkHashOnRead false
version 132
in_colorspace scene_linear
out_colorspace scene_linear
name Write2
xpos -1025
ypos 2230
}
有一个单词字符串,space,打开 curly 然后所有内容直到新行大括号。我想匹配第一个字符串,然后匹配大括号内的所有内容。
我已经到了:
^([a-zA-Z]+\s)+(\{[^}]*.*\})$
这让我看到了第一个右花括号。我希望它一直到最后一个花括号。
因此匹配 1 将是 BackdropNode {...},第 1 组为 BackdropNode,第 2 组为 {...}。然后匹配 2 将是 Write {...} with group 1 of Write 和 group 2 of {...}.
你可以使用
(?sm)^([a-zA-Z]+)\s*\{(.*?)}(?=\n[a-zA-Z]+\s*{\n|\Z)
参见regex demo。
详情:
(?sm)
- re.S
/ re.DOTALL
+ re.M
/ re.MULTILINE
内联修饰符
^
- 行首
([a-zA-Z]+)
- 第 1 组:一个或多个字母
\s*
- 零个或多个空格
\{
- 一个 {
字符
(.*?)
- 第 2 组:尽可能少的任何零个或多个字符
}
- 一个 }
字符
(?=\n[a-zA-Z]+\s*{\n|\Z)
- 一个积极的前瞻,需要一个换行符,然后是一个或多个字母,零个或多个空格,{
和一个换行符,或者整个字符串的结尾。
我非常不擅长正则表达式,这几天一直在用头撞墙。我正在尝试使用 Python 从 .nk nuke 脚本中提取信息。格式如下:
> BackdropNode {
inputs 0
name BackdropNode6
tile_color 0x555555ff
label RDN
note_font_size 42
xpos -1136
ypos -4272
bdwidth 451
bdheight 529
}
Write {
file "\[value project_directory]/_output_/\[string range \[file tail \[value root.name]] 0 20].mov"
colorspace sRGB
raw true
file_type mov\{(.*?)\}
mov64_format "mov (QuickTime / MOV)"
mov64_codec AVdh
mov64_dnxhd_codec_profile "DNxHD 422 8-bit 145Mbit"
mov64_dnxhr_codec_profile "SQ 4:2:2 8-bit"
mov64_pixel_format {{0} "yuv420p\tYCbCr 4:2:0 8-bit"}
mov64_quality High
mov64_advanced 1
mov64_write_timecode true
mov64_gop_size 12
mov64_b_frames 0
mov64_bitrate 20000
mov64_bitrate_tolerance 40000000
mov64_quality_min 2
mov64_quality_max 31
render_order 3
checkHashOnRead false
version 132
in_colorspace scene_linear
out_colorspace scene_linear
name Write2
xpos -1025
ypos 2230
}
有一个单词字符串,space,打开 curly 然后所有内容直到新行大括号。我想匹配第一个字符串,然后匹配大括号内的所有内容。
我已经到了:
^([a-zA-Z]+\s)+(\{[^}]*.*\})$
这让我看到了第一个右花括号。我希望它一直到最后一个花括号。
因此匹配 1 将是 BackdropNode {...},第 1 组为 BackdropNode,第 2 组为 {...}。然后匹配 2 将是 Write {...} with group 1 of Write 和 group 2 of {...}.
你可以使用
(?sm)^([a-zA-Z]+)\s*\{(.*?)}(?=\n[a-zA-Z]+\s*{\n|\Z)
参见regex demo。
详情:
(?sm)
-re.S
/re.DOTALL
+re.M
/re.MULTILINE
内联修饰符^
- 行首([a-zA-Z]+)
- 第 1 组:一个或多个字母\s*
- 零个或多个空格\{
- 一个{
字符(.*?)
- 第 2 组:尽可能少的任何零个或多个字符}
- 一个}
字符(?=\n[a-zA-Z]+\s*{\n|\Z)
- 一个积极的前瞻,需要一个换行符,然后是一个或多个字母,零个或多个空格,{
和一个换行符,或者整个字符串的结尾。