Python 3正则表达式协助

Python 3正则表达式协助,python,regex,python-3.x,Python,Regex,Python 3.x,我目前正试图扫描一个文件,寻找一个特定的模式,并捕获匹配模式的片段,以便在替换字符串中使用 我当前的Python3脚本使用这种模式,并在简单的情况下捕获数据 def readFile(filename): pattern = re.compile(b"(<%InsertIf expression=\"\$\{\(\((.*?)\[\'(.*?)\'\].*?\'(.*?)\'\)\)\}\".*?\/InsertIf%>)", re.DOTALL)

我目前正试图扫描一个文件,寻找一个特定的模式,并捕获匹配模式的片段,以便在替换字符串中使用

我当前的Python3脚本使用这种模式,并在简单的情况下捕获数据

    def readFile(filename):
        pattern = re.compile(b"(<%InsertIf expression=\"\$\{\(\((.*?)\[\'(.*?)\'\].*?\'(.*?)\'\)\)\}\".*?\/InsertIf%>)", re.DOTALL)
        with open(filename, 'r+') as f:
            data = mmap.mmap(f.fileno(), 0)
            for match in re.finditer(pattern, data):
                print(match.groups())
                print ("")
当表达式本身有附加条件时,挑战就开始了。上面的原始代码片段显示了输入的更多细节。我可以让简单的表达式按需要工作,但在更复杂的语句中它会崩溃


我最初试着用一个简单的InsertIf盒让它工作。然后我可以循环该文件来处理InsertElse和其他情况

给你一个解决第一个问题的想法。 您可以采取两个步骤:

  • 使用模式获取整个表达式:

    re.compile(b“()”,re.DOTALL)

  • 获得上下文后,可以使用另一个模式查找名称、属性和值

    ([^\[]*)\[\'([^\']*)\].*?\'([^\']*)\'

    在这里,我想使用
    [\']*
    [\[\]*
    而不是
    *?

  • 使用
    findall()
    查找所有匹配项


    第二个问题是将一种“语言”转换为另一种语言,需要获得更多信息,如
    ==

    为您提供解决第一个问题的思路。 您可以采取两个步骤:

  • 使用模式获取整个表达式:

    re.compile(b“()”,re.DOTALL)

  • 获得上下文后,可以使用另一个模式查找名称、属性和值

    ([^\[]*)\[\'([^\']*)\].*?\'([^\']*)\'

    在这里,我想使用
    [\']*
    [\[\]*
    而不是
    *?

  • 使用
    findall()
    查找所有匹配项


    第二个问题是将一种“语言”转换为另一种语言需要获得更多信息,如
    ==

    ,这似乎是不可能的。我得到的最接近的结果是模式的最后一次出现总是匹配的(我只尝试了
    |
    示例)。
    (.*)
    。这可能有助于您理解为什么,正如Python和JavaScript一样:您可以测试我在这里制作的正则表达式:您只能获得与正则表达式中的组一样多的组值,如果您不定义7个组,则无法获得更多。如果您有7个
    |
    条件,您可以使用PyPi
    Regex
    模块吗,您可以使用
    .captures
    集合。感谢pgmann和wiktor stribizew。我一直在使用类似的工具测试各种模式。我知道返回的组数是基于regex中定义的组数。我想我希望有一个神奇的循环regex,可以提前查找条件表达式。这可能实际上是不可能的,但我想在认输之前寻求建议。我最好捕获整个组并分两步操作字符串。你能分享一个输入字符串和预期的输出吗?这样我们就可以回答这个问题。这似乎是不可能的。我得到的最接近的结果是e模式的最后一次出现总是匹配的(我只尝试了
    |
    示例)。
    (.*)
    。这可能有助于您理解为什么,正如Python和JavaScript一样:您可以测试我在这里制作的正则表达式:您只能获得与正则表达式中的组一样多的组值,如果您不定义7个组,则无法获得更多。如果您有7个
    |
    条件,您可以使用PyPi
    Regex
    模块吗,您可以使用
    .captures
    集合。感谢pgmann和wiktor stribizew。我一直在使用类似的工具测试各种模式。我知道返回的组数是基于regex中定义的组数。我想我希望有一个神奇的循环regex,可以提前查找条件表达式。这实际上可能是不可能的,但我想在认输之前寻求建议。我最好捕获整个组并分两步操作字符串。您能否共享一个输入字符串和预期的输出?以便我们能够回答问题。
    <%InsertIf expression="${((user.MemberAttribute['treatmentcode'] == 'NM'))}" %>some random text goes here<sup>®</sup> membership<%/InsertIf%><%InsertIf expression="${((user.MemberAttribute['treatmentcode'] == 'N1'))}" %>some random text goes here<sup>®</sup> upgrade.<%/InsertIf%><br />
    
    (b'<%InsertIf expression="${((user.MemberAttribute[\'treatmentcode\'] == \'NM\'))}" %>some random text goes here<sup>\xc2\xae</sup> membership<%/InsertIf%>', b'user.MemberAttribute', b'treatmentcode', b'NM')
    
    (b'<%InsertIf expression="${((user.MemberAttribute[\'treatmentcode\'] == \'N1\'))}" %>some random text goes here<sup>\xc2\xae</sup> upgrade.<%/InsertIf%>', b'user.MemberAttribute', b'treatmentcode', b'N1') 
    
    <%InsertIf expression="${((user.MemberAttribute['country'] == 'US') || (user.MemberAttribute['country'] == 'CA'))}" %>
    
    <%InsertIf expression="${((user.MemberAttribute['country']=='US') and (user.MemberAttribute['treatmentcode']=='NM'))}" %><%InsertCSE id="XXXXX"%><%/InsertIf%>
    
    <%InsertIf 
    expression="${((user.MemberAttribute['treatmentcode']=='NM'))}" %>
    <%InsertCSE id="4000116068"%><%/InsertIf%>
    <%InsertElse expression="${((user.MemberAttribute['treatmentcode']=='N1'))}" %>
    <%InsertCSE id="4000116069"%>
    <%/InsertElse%>
    
    %%[ if treatmentcode == "NM" then ]%%
    %%=contentArea("4000116068")=%%
    %%[ elseif treatmentcode == "N1" then ]%%
    %%=contentArea("4000116069")=%%
    %%[ endif ]%%