无法处理具有Regex模式的标志参数

gj3fmq9x  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(110)

我是Python新手,也是Regex新手,所以如果这是一个显而易见的问题,请原谅我。我正在使用Python 3.10,并编写了一个函数,目的是遍历用户提供的目录。它将遍历所有子目录,查找存储在其中的XML文件。我针对的目录是来自移动设备的应用程序数据。然后,我希望在恢复的XML上运行Regex搜索,查找长度为32个字母数字字符的XML,并只返回这些行。
当我运行下面的代码时,我得到错误ValueError:无法处理具有已编译模式的标志参数。

import os
import re
import xml.etree.ElementTree as ET

def xml_search(directory):
    xml_files = []
    for root, dir, 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:
             tree = ET.parse(f)
             root = tree.getroot()
             strings = []
             for string in root.iter():
                 strings.append(string)
                 regex = re.compile(r"^[a-zA-Z0-9\-._]{32}$", re.I | re.M | re.S)
                 return_strings = re.findall(regex, strings, re.I | re.M | re.S)
                 print(return_strings)

最后的print函数只是在继续使用功能之前进行错误检查,不会出现在最终代码中。|相对于M|re. S是我解决问题的尝试。
我已经确认字符串列表正在从XML文件返回解析后的数据,但无法对它运行regex搜索。

3pvhb19x

3pvhb19x1#

首先,我想把re.compile调用移到外循环之外(之前),但问题似乎是,您传递给re.findall的是一个要搜索的列表,而它应该是一个字符串。
由于这个错误和您已经简化了代码的事实(例如,我看不到list strings将在哪里使用),因此我不能确定您到底要做什么,但可能是以下内容:

import os
import re
import xml.etree.ElementTree as ET

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

    regex = re.compile(r"^[a-zA-Z0-9\-._]{32}$", re.I | re.M | re.S)
    for xml_file in xml_files:
        with open(xml_file, "r") as f:
            tree = ET.parse(f)
            root = tree.getroot()
            strings = []
            return_strings = []
            for string in root.iter():
                strings.append(string)
                return_strings.extend(regex.findall(string))
            print(return_strings)

相关问题