我目前正在尝试扫描文件中的特定模式,并捕获匹配模式的片段以用于替换字符串。
我当前的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'))}" %>
在上述情况下,我期待第二组捕获:
但由于该模式并未考虑第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和其他情况。
答案 0 :(得分:0)
给你一个解决第一个问题的理想。 您可以采取两个步骤:
用模式获取整个表达式:
re.compile(b"(<%InsertIf expression=\"\$\{\(\((.*?)\)\)\}\".*?\/InsertIf%>)", re.DOTALL)
获取上下文后,可以使用其他模式查找名称,属性和值
([^\[]*)\[\'([^\']*)\'\].*?\'([^\']*)\'
在这里,我想使用[\']*
或[\[]*
代替.*?
使用findall()
查找所有匹配项。
将“语言”转换为另一种语言的第二个问题需要获得更多信息,例如==