从python中成功的正则表达式匹配构建字典

从python中成功的正则表达式匹配构建字典,python,regex,iterable,dictionary-comprehension,Python,Regex,Iterable,Dictionary Comprehension,我对Python非常陌生,我正在尝试解析一个文件。只有文件中的某些行包含感兴趣的数据,我希望最终得到一个从文件中有效匹配行解析的内容字典 下面的代码可以工作,但有点难看,我正在尝试学习如何完成它,可能需要理解,或者使用多行正则表达式。我正在使用Python 3.2 file_data = open('x:\\path\\to\\file','r').readlines() my_list = [] for line in file_data: # discard lines which

我对Python非常陌生,我正在尝试解析一个文件。只有文件中的某些行包含感兴趣的数据,我希望最终得到一个从文件中有效匹配行解析的内容字典

下面的代码可以工作,但有点难看,我正在尝试学习如何完成它,可能需要理解,或者使用多行正则表达式。我正在使用Python 3.2

file_data = open('x:\\path\\to\\file','r').readlines()
my_list = []
for line in file_data:
    # discard lines which don't match at all
    if re.search(pattern, line):
        # icky, repeating search!!
        one_tuple = re.search(pattern, line).group(3,2)
        my_list.append(one_tuple)
my_dict = dict(my_list)

你能推荐一个更好的实现吗?

这里有一些对你的代码的快速优化:

my_dict = dict()

with open(r'x:\path\to\file', 'r') as data:
    for line in data:
        match = re.search(pattern, line)
        if match:
            one_tuple = match.group(3, 2)
            my_dict[one_tuple[0]] = one_tuple[1]

我不确定我是否会推荐它,但这里有一种方法可以尝试使用理解来代替(为了简单起见,我用字符串代替了文件)

本着我建议的精神

with open(r'x:\path\to\file', 'r') as data:
    for line in data:
        try:
            m = re.search(pattern, line)
            my_dict[m.group(2)] = m.group(3)
        except AttributeError:
            pass
另一种方法是继续使用列表,但重新设计模式,使其仅包含两个组
(键,值)
。然后你可以简单地做:

  matches = [re.findall(pattern, line) for line in data]
  mydict = dict(x[0] for x in matches if x)

谢谢你的回复。把它们放在一起之后,我得到了

file_data = open('x:\\path\\to\\file','r').read()
my_list = re.findall(pattern, file_data, re.MULTILINE)
my_dict = {c:b for a,b,c in my_list}

但是如果没有帮助,我想我今天不可能到达那里。

理解可能很漂亮,但是你不能轻易地将变量绑定到其中的值,所以你需要双
搜索。只需使用循环。听写理解;我喜欢!您可能希望将正则表达式中的第一组设置为非捕获(
?:
),以跳过理解步骤:
my_dict=dict(re.findall…
)。但是:将所有数据读入一个变量,而不是在一个文件对象上迭代(并隐式调用
readline()
method),伸缩性不是很强
re.findall()
在迭代器而不是变量上工作得非常好。请按照您的代码片段提供一些详细信息和解释,以便读者更清楚地了解。
matchRes = pattern.match(line)
if matchRes:
    my_dict = matchRes.groupdict()
matchRes = pattern.match(line)
if matchRes:
    my_dict = matchRes.groupdict()