Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式:在文本文件中匹配模式,并为每个匹配实例指定名称_Python_Regex - Fatal编程技术网

python正则表达式:在文本文件中匹配模式,并为每个匹配实例指定名称

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] 我需要提取集合并为每个集

我有一个文本文件,其中包含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 我已读入文本文件并创建一个正则表达式模式以匹配:

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)