我正在使用搜索和替换编程作业。我是学生,我发现正则表达式文档有点压倒性(例如https://docs.python.org/2/library/re.html),所以我希望有人可以向我解释如何完成我正在寻找的东西。
我使用正则表达式从我的文档中获取字符串列表。他们都看起来像这样:
%@import fileName (regexStatement)
一个实际的例子:
%@import script_example.py ( *out =(.|\n)*?return out)
现在,我想知道如何将它们分开,所以我将fileName和regexStatements作为单独的字符串。我假设使用正则表达式或字符串拆分函数,但我不知道如何使它适用于%@ import fileName(regexstatement)的各种变体。例如,使用括号分割可能会触及正则表达式语句的中间位置,或者如果括号是fileName的一部分。赋值没有指定它是否只能从python文件导入,所以我不相信我可以在正则表达式语句之前使用“.py(”作为分裂点。
我正在考虑使用正则表达式“%@ import”来导入导入后的差距,“\ .. *”以达到fileName之后的差距。但我不知道如何摆脱封装正则表达式语句的括号,或者如何使用它来实际正确地拆分字符串,所以我有一个存储fileName的变量和一个存储我的列表中每个条目的regexStatement。
非常感谢您的关注!
答案 0 :(得分:0)
如果文件名不能包含空格,只需使用maxsplit 2在空格上拆分字符串:
>>> line.split(' ', 2)
['%@import', 'script_example.py', '( *out =(.|\n)*?return out)']
maxsplit 2使它只拆分前两个空格,并保留正则表达式中的任何空格。现在您将文件名作为第二个元素,将正则表达式作为第三个元素。从你的陈述中不清楚括号是否是正则表达式的一部分(即作为捕获组)。如果没有,您可以通过修剪该部分中的第一个和最后一个字符轻松删除它们。
如果您指定的值如下:
filename, regex = line.split(' ', 2)[1:]
然后你可以用括号去掉括号:
regex = regex[1:-1]
答案 1 :(得分:0)
应该做得很好
^%@import (\S+) \((.*)\)
或者,如果文件名可能包含空格:
^%@import ((?:(?! \().)+) \((.*)\)
两个表达式都包含两个组,一个用于文件名,另一个用于括号的内容。如果使用单行,则在整个文件或正常模式下以多行模式运行。
这:((?:(?! \().)+)
分解为:
( # group start (?: # non-capturing group (?! # negative look-ahead: a position NOT followed by \( # " (" ) # end look-ahead . # match any char (this is part of the filename) )+ # end non-capturing group, repeat ) # end group
表达式的其他部分应该是不言自明的。
import re
line = "%@import script_example.py ( *out =(.|\\n)*?return out)"
pattern = r'^%@import (\S+) \((.*)\)'
match = re.match(pattern, line)
if match:
print "match.group(1) '" + match.group(1) + "'"
print "match.group(2) '" + match.group(2) + "'"
else:
print "No match."
打印
match.group(1) 'script_example.py' match.group(2) ' *out =(.|\n)*?return out'
答案 2 :(得分:0)
为了匹配像%@import script_example.py ( *out =(.|\n)*?return out)
这样的东西我建议:
r'%@impor[\w\W ]+'
请注意:
\w match any word character [a-zA-Z0-9_]
\W match any non-word character [^a-zA-Z0-9_]
因此您可以使用re.findall()
查找所有匹配项:
import re
re.findall(r'%@impor[\w\W ]+', your_string)