使用字典键捕获组的正则表达式

3

我帮助您翻译以下关于IT技术的内容,涉及到一个字典函数中正确命名捕获的显示问题。我的程序读取一个.txt文件并将其中的文本转化成字典格式。我已经确定了正确的正则表达式公式以便进行捕获。

这是我的File.txt文件:

file Science/Chemistry/Quantum 444 1
file Marvel/CaptainAmerica 342 0
file DC/JusticeLeague/Superman 300 0
file Math 333 0
file Biology 224 1

这是一个能够捕获我想要的内容的正则表达式链接

通过查看链接,我想要显示的部分用绿色和橙色进行了高亮。

下面是我代码中有效的部分:

rx= re.compile(r'file (?P<path>.*?)( |\/.*?)? (?P<views>\d+).+')
i = sub_pattern.match(data) # 'data' is from the .txt file
x = (i.group(1), i.group(3))
print(x) 

但是由于我要把 .txt 文件变成字典,我无法想出如何将 .group(1) 或 .group(3) 作为键来显示在我的显示函数中。我不知道如何在使用 print("Title: %s | Number: %s" % (key[1], key[3])) 时显示这些组的内容。希望有人能帮助我在字典函数中实现这一点。

这是我的字典函数:

def create_dict(data):
    dictionary = {}
    for line in data:
      line_pattern = re.findall(r'file (?P<path>.*?)( |\/.*?)? (?P<views>\d+).+', line)
      dictionary[line] = line_pattern
      content = dictionary[line]
      print(content)
    return dictionary

我想让我的文本文件输出看起来像这样:

Science 444
Marvel 342
DC 300
Math 333
Biology 224

1
你可以逐行读取文件,使用 m = re.search(r'file ([^/\s]*).*?(\d+)', line) (演示) 在一行中搜索匹配项,然后 if m: 你可以将 "{} {}".format(m.group(1), m.group(2)) 添加到输出中。 - Wiktor Stribiżew
@WiktorStribiżew 我明白这是可能的,谢谢。我该如何将其应用到我的字典函数中呢?因为我需要将文件中的文本转换为字典,并提取这些组以进行显示。 - smokingpenguin
2
请查看这个Python演示。但是您可能需要像这样的东西 - Wiktor Stribiżew
@WiktorStribiżew 是的!像这个链接一样的东西帮了我很多。它解答了我的问题。谢谢。 - smokingpenguin
请参见我下面的回答。链接 - Wiktor Stribiżew
@WiktorStribiżew 我一直在等你发布,这样我就可以给你打勾了。谢谢! - smokingpenguin
3个回答

2
您可以使用以下方法创建并填充一个包含文件数据的字典:
def create_dict(data):
    dictionary = {}
    for line in data:
        m = re.search(r'file\s+([^/\s]*)\D*(\d+)', line)
        if m:
            dictionary[m.group(1)] = m.group(2)
    return dictionary

基本上,它执行以下操作:
  • 定义一个名为dictionary的字典
  • 逐行读取data
  • 查找file\s+([^/\s]*)\D*(\d+)的匹配项,如果有匹配项,则使用两个捕获组值形成一个字典键值对。

我建议使用的正则表达式是

file\s+([^/\s]*)\D*(\d+)

查看解释它的 Regulex图表

enter image description here

然后,您可以像这样使用它
res = {}
with open(filepath, 'r') as f:
    res = create_dict(f)
print(res)

查看Python演示

1
您已经在'line_pattern'中使用了命名组,只需将其放入字典中即可。re.findall 在这里无法工作。另外,在'/'之前的字符转义 '\' 是多余的。因此,您的字典函数应该是:
def create_dict(data):
    dictionary = {}
    for line in data:
        line_pattern = re.search(r'file (?P<path>.*?)( |/.*?)? (?P<views>\d+).+', line)
    dictionary[line_pattern.group('path')] = line_pattern.group('views')
    content = dictionary[line]
    print(content)
    return dictionary

0

这个正则表达式 可以帮助您将输入分成四组,其中第二组和第四组是您可以简单提取并用 空格 分隔的目标组:

 (file\s)([A-Za-z]+(?=\/|\s))(.*)(\d{3})

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接