Python 3 REGEX帮助

时间:2016-06-20 18:24:10

标签: python regex python-3.x

我目前正在尝试扫描文件中的特定模式,并捕获匹配模式的片段以用于替换字符串。

我当前的Python 3脚本正在使用此模式,并在简单的情况下捕获数据。

    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 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表达式具有附加条件时,我无法找出用于正则表达式的适当模式。

这是我正在努力解决的两个复杂的片段。在一个案例中,还有一个额外的&#39; ||&#39;有条件的。在另一个中有一个&#34;和&#34;有条件的。

<%InsertIf expression="${((user.MemberAttribute['country'] == 'US') || (user.MemberAttribute['country'] == 'CA'))}" %>

在上述情况下,我期待第二组捕获:

  1. 完整InsertIf捕获的字符串
  2. user.MemberAttribute
  3. 国家
  4. US
  5. user.MemberAttribute
  6. 国家
  7. CA
  8. 但由于该模式并未考虑第4次捕获返回的条件: 4.美国&#39;)|| (user.MemberAttribute [&#39; country&#39;] ==&#39; CA

    AND示例

    <%InsertIf expression="${((user.MemberAttribute['country']=='US') and (user.MemberAttribute['treatmentcode']=='NM'))}" %><%InsertCSE id="XXXXX"%><%/InsertIf%>
    

    与&#39; ||&#39;类似的期望和糟糕的结果上面的例子。

    非常感谢对该模式的任何帮助。我仍然在学习正则表达式,这个只是我的深度。

    感谢。

    根据要求添加其他详细信息: 我本质上是尝试在文件中执行一种语法到另一种语法的转换。

    示例:我想找到这种模式......

    <%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 ]%%
    

    当有额外的条件作为表达本身的一部分时,挑战就会发挥作用。上面的原始片段显示了输入的更多细节。我可以按照需要使用简单的表达式,但它会在更复杂的语句中分离。

    我最初试图采用一个简单的InsertIf案例并使其正常工作。然后我可以循环文件来处理InsertElse和其他情况。

1 个答案:

答案 0 :(得分:0)

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

  1. 用模式获取整个表达式:

    re.compile(b"(<%InsertIf expression=\"\$\{\(\((.*?)\)\)\}\".*?\/InsertIf%>)", re.DOTALL)

  2. 获取上下文后,可以使用其他模式查找名称,属性和值

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

    在这里,我想使用[\']*[\[]*代替.*?

  3. 使用findall()查找所有匹配项。

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