Python / Regex拆分特定格式的返回字符串

时间:2014-10-18 18:12:43

标签: python regex

我正在使用搜索和替换编程作业。我是学生,我发现正则表达式文档有点压倒性(例如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。

非常感谢您的关注!

3 个答案:

答案 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 ]+'

DEMO

请注意:

\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)