python正则表达式:在文本文件中匹配模式,并为每个匹配实例指定名称
我有一个文本文件,其中包含4组用方括号划分的数字: [114.63332、-114.63349、-114.63423、-114.63305][-103.55583、-104.00265、-104.64165、-105.14679、-106.63325、-106.61103][-109.04984、-109.06017、-109.06015、-109.0498][-114.04392、-114.04391、-114.04375、-114.04195、-114.04558] 我需要提取集合并为每个集合指定名称:a_lon,b_lon,c_lon,d_lon 我已读入文本文件并创建一个正则表达式模式以匹配:python正则表达式:在文本文件中匹配模式,并为每个匹配实例指定名称,python,regex,Python,Regex,我有一个文本文件,其中包含4组用方括号划分的数字: [114.63332、-114.63349、-114.63423、-114.63305][-103.55583、-104.00265、-104.64165、-105.14679、-106.63325、-106.61103][-109.04984、-109.06017、-109.06015、-109.0498][-114.04392、-114.04391、-114.04375、-114.04195、-114.04558] 我需要提取集合并为每个集
with open('x_lons.txt', 'r') as f:
x_lons = f.read()
print(type(x_lons))
返回类“str”
match = re.compile(r'(\[.*?\])')
for m in re.finditer(match, x_lons):
print(m.groups())
它返回打印的匹配对象:
('[-114.63332, -114.63349, -114.63423, …,-114.63305]',)
('[-103.55583, -104.00265, -104.64165, -105.14679, …, -106.63325, -106.61103]')
('[-109.04984, -109.06017, -109.06015, …, -109.0498]',)
('[-114.04392, -114.04391, -114.04375, -114.04195, …, -114.04558]',)
我还运行了一个re.split来获得类似的输出,没有“()”括号
此时,我无法确定如何为模式匹配的每个数字集分配名称。我可以在print()中看到集合,但无法确定是否将集合分配给名称
a_lon, b_lon, c_lon, d_lon = eval(f.read().replace("]", "],"))
这行得通吗?首先,你的捕猎群太大了。现在,它只捕获数字列表,然后将其解析为浮点数,并附加到列表中。此外,如果你这样做,你可能不想自己创建变量(比如如果你有从'a_lon'到'zzz_lon'之类的东西,你会有糟糕的一天)
另一件事,如果您的数据始终严格包含4个方括号分隔的数字列表,您可以使用另一个与所有4个数字列表匹配的正则表达式,您也可以使用更具体的正则表达式,如果您的数据损坏,程序将不会失败。缩进已关闭。还有,你的结果是什么?数据来自哪里?顺便问一下,我相信这是一个复制品。这能回答你的问题吗?这很有效,谢谢你。由于x_lons中的项是字符串,所以我更改了.append(str)并通过键访问dict以获得单独的命名列表以进行处理。由于每个列表中的起始和结束列表元素分别有“[”或“]”,我用正确的字符串替换了这些元素,然后将列表中的元素转换为浮点。感谢您的帮助为这个简单的任务使用eval看起来很简单,但实际上这是一个坏主意,因为它引入了一个主要的漏洞。就像op在实际生产中使用来自用户或网络的代码一样,这个后门可以用来搞乱脚本。然而,如果你只想自己使用它,并且数据保证是干净的,那么简单而肮脏的方法也可能奏效。Op说“我有一个文本文件,其中包含4组用方括号划分的数字”,所以这不是问题,除非Op说“这是用户输入”
import re
with open('tmp.txt', 'r') as f:
x_lons = f.read()
match = re.compile(r'\[(.*?)\]')
lons = {
'a_lon': list(),
'b_lon': list(),
'c_lon': list(),
'd_lon': list()
}
current_set_letter = 97 # 97 is the character 'a'
for m in re.finditer(match, x_lons):
one_set = m.groups()[0] # as we know that there is only one group here
for num in one_set.split(r','):
lons[f'{chr(current_set_letter)}_lon'].append(float(num))
current_set_letter += 1
print(lons)