【问题标题】:Unable to return required strings from XML files无法从 XML 文件返回所需的字符串
【发布时间】:2023-02-01 22:35:41
【问题描述】:

我创建了这段代码,让用户指向一个目录,并通过该目录查找 .xml 文件。一旦找到,程序应该搜索每个文件以查找长度为 32 位的字符串。这是唯一的要求,此时内容并不重要,只要它返回 32 位字符串即可。

当运行程序迭代可用文件时,我尝试使用 Python 中的 regex 模块,如下所示。返回所有文件名,但 String_recovery 函数仅返回空列表。我已经确认 xml 在视觉上包含 32 位字符串。

import os
import re
import tkinter as tk
from tkinter import filedialog



def string_recovery(data):
    short_string = re.compile(r"^[a-zA-Z0-9\-._]{32}$")
    strings = re.findall(short_string, data)
    print(strings)


def xml_search(directory):
    xml_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".xml"):
                xml_files.append(os.path.join(root, file))
    print("The following XML files have been found.")
    print(xml_files)

    for xml_file in xml_files:
        with open(xml_file, "r") as f:
            string_recovery(f.read())


def key_finder():
    directory = filedialog.askdirectory()
    xml_search(directory)


key_finder()

【问题讨论】:

  • 您的“32 位字符串”是什么样的?您的 XML 文件是什么样的?
  • 欢迎来到堆栈溢出。我无法理解这个问题,因为字符串的长度没有测量位。此外,该函数根本没有return(请阅读What is the purpose of the return statement? How is it different from printing?),并且唯一涉及的列表是xml_files
  • m 标志是默认标志吗?我不认为在这种情况下 ^$ 是文件的开头和结尾而不是一行。也许尝试将 m 标志添加到您的parrern。

标签: python python-3.x


【解决方案1】:

也许你应该检查每一行:

    for xml_file in xml_files:
        with open(xml_file, "r") as f:
            string_recovery(f.read())

如果您的string_recovery 工作正常(用一行尝试,我无法重现您的示例,但创建一个变量line = 并在其中放一行应该恢复的行。

遍历每一行而不是整个文件:

    for xml_file in xml_files:
        with open(xml_file, "r") as f:
            for line in f.readliens():
                string_recovery(line)

【讨论】:

    【解决方案2】:

    默认情况下,python 模式不是“多行”的,因此 ^$ 匹配文本块的开始和结束,而不是每一行。您需要设置此标志:

    相比:

    import re
    
    text = """
    12345678901234567890123456789011
    12345678901234567890123456789011
    """
    pattern = r"^[a-zA-Z0-9-._]{32}$"
    print(re.findall(pattern, text, re.M))
    

    给予:

    [
        '12345678901234567890123456789011',
        '12345678901234567890123456789011'
    ]
    

    和:

    import re
    
    text = """
    12345678901234567890123456789011
    12345678901234567890123456789011
    """
    pattern = r"^[a-zA-Z0-9-._]{32}$"
    print(re.findall(pattern, text))
    

    给予:

    []
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多