Python 3正则表达式协助
我目前正试图扫描一个文件,寻找一个特定的模式,并捕获匹配模式的片段,以便在替换字符串中使用 我当前的Python3脚本使用这种模式,并在简单的情况下捕获数据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)
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个|
条件,您可以使用PyPiRegex
模块吗,您可以使用.captures
集合。感谢pgmann和wiktor stribizew。我一直在使用类似的工具测试各种模式。我知道返回的组数是基于regex中定义的组数。我想我希望有一个神奇的循环regex,可以提前查找条件表达式。这可能实际上是不可能的,但我想在认输之前寻求建议。我最好捕获整个组并分两步操作字符串。你能分享一个输入字符串和预期的输出吗?这样我们就可以回答这个问题。这似乎是不可能的。我得到的最接近的结果是e模式的最后一次出现总是匹配的(我只尝试了|
示例)。(.*)
。这可能有助于您理解为什么,正如Python和JavaScript一样:您可以测试我在这里制作的正则表达式:您只能获得与正则表达式中的组一样多的组值,如果您不定义7个组,则无法获得更多。如果您有7个|
条件,您可以使用PyPiRegex
模块吗,您可以使用.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 ]%%