尝试添加一些空格到正则表达式。

(a|b|c)+

而且,你的正则表达式可以减少到这

(POLYGON\s*\((?P\(\s*(?P(?P\s*(\d+\s+\d+)\s*,){3,})\s*(?P\d+\s+\d+)\s*\)(?:\s*,\s*|\s*\)))+)

原:

(POLYGON\s*\((?P\(\s*(?P(?P\s*(\d+\s+\d+)\s*,){3,})\s*(?P\d+\s+\d+)\s*\),)*(?P\(\s*(?P(?P\s*(\d+\s+\d+)\s*,){3,})\s*(?P\d+\s+\d+)\s*\))\s*\))

请参阅下文了解这些组包含的内容。

(       # (1 start) 
     POLYGON \s* \(
     (?P<polygons>     # (2 start) 
      \(\s* 
      (?P<points>     # (3 start) 
       (?P<point>     # (4 start) 
        \s* 
        (\d+ \s+ \d+)    # (5) 
        \s* 
        , 
       ){3,}       # (4 end) 
      )        # (3 end) 
      \s*    
      (?P<last_point> \d+ \s+ \d+) # (6) 
      \s* \), 
    )*       # (2 end) 
     (?P<last_polygon>    # (7 start) 
      \(\s* 
      (?P<points>     # (8 start) 
       (?P<point>     # (9 start) 
        \s* 
        (\d+ \s+ \d+)    # (10) 
        \s* 
        , 
       ){3,}       # (9 end) 
      )        # (8 end) 
      \s* 
      (?P<last_point> \d+ \s+ \d+) # (11) 
      \s* \) 
    )        # (7 end) 
     \s* \) 
)        # (1 end) 

输入

POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0),(3 3, 3 7, 7 7, 7 3, 3 3)) 

输出

** Grp 0    - (pos 0 , len 65) 
POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0),(3 3, 3 7, 7 7, 7 3, 3 3)) 
** Grp 1    - (pos 0 , len 65) 
POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0),(3 3, 3 7, 7 7, 7 3, 3 3)) 
** Grp 2 [polygons]  - (pos 9 , len 30) 
(0 0, 0 10, 10 10, 10 0, 0 0), 
** Grp 3 [points]  - (pos 10 , len 23) 
0 0, 0 10, 10 10, 10 0, 
** Grp 4 [point]  - (pos 27 , len 6) 
10 0, 
** Grp 5    - (pos 28 , len 4) 
10 0 
** Grp 6 [last_point] - (pos 34 , len 3) 
0 0 
** Grp 7 [last_polygon] - (pos 39 , len 25) 
(3 3, 3 7, 7 7, 7 3, 3 3) 
** Grp 8 [points]  - (pos 40 , len 19) 
3 3, 3 7, 7 7, 7 3, 
** Grp 9 [point]  - (pos 54 , len 5) 
7 3, 
** Grp 10    - (pos 55 , len 3) 
7 3 
** Grp 11 [last_point] - (pos 60 , len 3) 
3 3 

可能的解决方案

这不是不可能的。它只需要一些额外的步骤。
(顺便说一下,是不是有一个WKT库可以解析这个给你吗?)

现在,我不知道你的语言能力,所以这只是一个普遍的方法。

All_Polygons
POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0),(3 3, 3 7, 7 7, 7 3, 3 3))
POLYGON\s*\((?P(?:\(\s*\d+\s+\d+(?:\s*,\s*\d+\s+\d+){2,}\s*\))(?:\s*,\(\s*\d+\s+\d+(?:\s*,\s*\d+\s+\d+){2,}\s*\))*)\s*\)
** Grp 1 [All_Polygons] - (pos 9 , len 55) 
(0 0, 0 10, 10 10, 10 0, 0 0),(3 3, 3 7, 7 7, 7 3, 3 3) 
All_Polygons
(0 0, 0 10, 10 10, 10 0, 0 0),(3 3, 3 7, 7 7, 7 3, 3 3)
(?:\(\s*(?P\d+\s+\d+(?:\s*,\s*\d+\s+\d+){2,})\s*\))
Single_Poly_All_Pts

这将会给你这2场单独的比赛,这可以被放入一个临时阵列,具有2名值的字符串:

** Grp 1 [Single_Poly_All_Pts] - (pos 1 , len 27) 
0 0, 0 10, 10 10, 10 0, 0 0 

** Grp 1 [Single_Poly_All_Pts] - (pos 31 , len 23) 
3 3, 3 7, 7 7, 7 3, 3 3 

3.如果2是成功的,设置使用临时数组循环比赛输出步骤2.
这会给你个别点的每个多边形。

(?P\d+\s+\d+)

再次,这是一个循环的匹配(或找到所有类型匹配的)。对于每个阵列元素
(多边形),这将产生各个点。

0 0, 0 10, 10 10, 10 0, 0 0
** Grp 1 [Single_Point] - (pos 0 , len 3) 
0 0 
** Grp 1 [Single_Point] - (pos 5 , len 4) 
0 10 
** Grp 1 [Single_Point] - (pos 11 , len 5) 
10 10 
** Grp 1 [Single_Point] - (pos 18 , len 4) 
10 0 
** Grp 1 [Single_Point] - (pos 24 , len 3) 
0 0 

而且,

3 3, 3 7, 7 7, 7 3, 3 3
** Grp 1 [Single_Point] - (pos 0 , len 3) 
3 3 
** Grp 1 [Single_Point] - (pos 5 , len 3) 
3 7 
** Grp 1 [Single_Point] - (pos 10 , len 3) 
7 7 
** Grp 1 [Single_Point] - (pos 15 , len 3) 
7 3 
** Grp 1 [Single_Point] - (pos 20 , len 3) 
3 3