使用正则清理多边形坐标字典值时出现re.error错误求助
问题描述
需要从包含命名多边形坐标的文本文件生成字典,键为多边形名称,值为对应的x、y坐标列表。文件多数条目格式规范,示例如下:
Name of polygon (12.345, 1.2567) (5.6789, 2.9876) (9.0345, 3.7654) (3.4556, 2.3445) Name of next polygon (x, y values)
但部分条目存在不规则情况,比如所有坐标在同一行、括号间有多余字符。现有代码尝试生成字典并用正则清理坐标,但运行报错:re.error: nothing to repeat at position 0,代码如下:
with open(fpath, 'r') as infile: d = {} #split the data into keys and values for group in infile.read().split('\n\n'): entry = group.split('\n') key, *val = entry d[key] = val for value in d.values(): value = re.split("*[\(.+$\)]*", str(value)) print(d)
解决方案
1. 正则错误原因及修复
你写的正则*[\(.+$\)]*有两个核心问题:
- 开头的
*没有前置匹配项,正则引擎无法识别要重复的内容,这就是报错的直接原因。 - 括号、
.等特殊字符未转义,且逻辑混乱,无法正确提取括号内的坐标内容。
正确思路是用正则匹配提取括号内的内容,而非分割。可以用re.findall(r'\(([^)]+)\)', text)来精准提取所有括号包裹的坐标字符串。
2. 完整可运行代码
以下代码会兼容规则/不规则的条目格式,最终将坐标转换为浮点数对的列表:
import re fpath = "你的文件路径.txt" polygon_dict = {} with open(fpath, 'r') as infile: # 按空行分割每个多边形数据组 for group in infile.read().split('\n\n'): group = group.strip() if not group: continue # 拆分多边形名称与坐标行 lines = group.split('\n') poly_name = lines[0].strip() # 合并所有坐标行,处理坐标全在同一行的情况 coords_text = ' '.join(line.strip() for line in lines[1:]) # 提取所有括号内的坐标对字符串 coord_strings = re.findall(r'\(([^)]+)\)', coords_text) # 将坐标字符串转换为(x,y)浮点数对 poly_coords = [] for cs in coord_strings: # 分割x、y值,处理可能的多余空格 x_str, y_str = [s.strip() for s in cs.split(',')] try: x = float(x_str) y = float(y_str) poly_coords.append((x, y)) except ValueError: # 跳过无法转换的无效坐标 continue polygon_dict[poly_name] = poly_coords print(polygon_dict)
代码说明
- 用
re.findall提取所有(...)内的内容,无论坐标是分行排列还是集中在同一行。 - 对每个坐标字符串做分割和类型转换,同时处理多余空格问题。
- 加入异常处理,跳过格式无效的坐标,避免程序崩溃。
- 跳过空数据组,避免生成无效的键值对。
内容的提问来源于stack exchange,提问作者raherin
相关产品推荐
相关产品推荐

