如何在python中使用带字符异常的多行DOTALL

如何在python中使用带字符异常的多行DOTALL,python,regex,python-3.x,Python,Regex,Python 3.x,我必须在python中找到多行模式。所以我使用的是来自regex的DOTALL,但它发现了比我需要的更多的东西 示例文件: if(condition_1) { .... some text some text if ((condition_1== condition_2) || (condition_3== condition_4) || (condition_6== condition_5) || (condition_

我必须在python中找到多行模式。所以我使用的是来自regex的DOTALL,但它发现了比我需要的更多的东西

示例文件:

if(condition_1)
{
....
some text
some text

if ((condition_1== condition_2)   ||
                 (condition_3== condition_4) ||
           (condition_6== condition_5)  ||
     (condition_7== condition_8)   ) // XYZ_variable
{
...
我的python正则表达式如下

re.compile(r'(if\s*?\()(.*?)(\/\/\s*?)(XYZ_variable)', re.DOTALL)
这是从第一个if条件到XYZ_变量的查找,但我只需要第二个if条件,其中存在的是XYZ_变量

因此,我改变了我的正则表达式如下,这是不工作的

re.compile(r'(if\s*?\()([^\{].*?)(\/\/\s*?)(XYZ_variable)', re.DOTALL)
我的最终输出应该是

if(condition_1)
    {
    ....
    some text
    some text

    if (((condition_1== condition_2)   ||
                     (condition_3== condition_4) ||
               (condition_6== condition_5)  ||
         (condition_7== condition_8)   ) || XYZ_variable )
    {
    ...
但是我的正则表达式是这样的

if ((condition_1)
        {
        ....
        some text
        some text

        if ((condition_1== condition_2)   ||
                         (condition_3== condition_4) ||
                   (condition_6== condition_5)  ||
             (condition_7== condition_8)   ) || XYZ_variable )
        {
        ...

正则表达式捕获匹配的第一个模式。这就是为什么它总是从第一个
if
开始

考虑以下最小示例,其中非贪婪的
不会修改输出:

>>> re.compile(r"if(.*?)XYZ").search("if a if b if c XYZ").group(1)
' a if b if c '
>>> re.compile(r"if(.*?)XYZ").search("if a XYZ if b if c XYZ").group(1)
' a '
但是,非贪婪的
会修改输出:

>>> re.compile(r"if(.*?)XYZ").search("if a if b if c XYZ").group(1)
' a if b if c '
>>> re.compile(r"if(.*?)XYZ").search("if a XYZ if b if c XYZ").group(1)
' a '
非贪婪的
仅在搜索的右侧操作。

您可以使用

re.sub(r'(?m)^(\s*if\s*)(\(.*(?:\n(?!\s*if\s*\().*)*)//\s*(\w+)\s*$', r'\1(\2 || \3)', s)

详细信息

  • (?m)
    -
    re.m
    标志
  • ^
    -行的开头
  • (\s*if\s*)
    -第1组:
    if
    包含0+空格
  • (\(.*(:\n(?!\s*if\s*()*)
    -第2组:
    • \(
      -a
    • *
      -行的其余部分
    • (?:\n(?!\s*if\s*\()*)
      -0次或多次重复
      • \n(?!\s*if\s*\()
        -一个换行符LF,后面不跟
        if
        ,if后面加0+空格,然后跟
      • *
        -行的其余部分
  • /\s*
    -
    /
    和0+空格
  • (\w+)
    -第3组:1个或多个单词字符
  • \s*$
    -0+空格和行尾
:

输出:

if(condition_1)
{
....
some text
some text

if (((condition_1== condition_2)   ||
                 (condition_3== condition_4) ||
           (condition_6== condition_5)  ||
     (condition_7== condition_8)   )  || XYZ_variable)
{
...

但是在这种情况下,c不是单独的,它应该被发现,就像如果b,如果c,而不是cis,那么有可能是反向正则表达式匹配,我首先找到XYZ_变量,然后返回,直到找到第一个if条件?看起来你在试着解析一种编程语言。你确定不想使用实际的解析器吗?然后你就可以把它当作一个语法树来使用了。@jpmc26这个反向正则表达式我只想尝试一下,这样我就可以在这里找到我的问题的答案。我还尝试了消极查找和积极查找,它们没有做多行查找。如果你的
如果
s总是作为第一行出现,请使用
re.findall(r'(?m)^\s*(如果\s*\()(.*(::\n(?!\s*如果\s*\()*)/\s*(XYZ\u变量)),文本)
@WiktorStribiżew我做了一个小把戏,找到所有if条件并搜索每个结果以查找这个正则表达式,但我的问题开始了。我如何将它写回同一个文件?很好地解释道。我也尝试过查找。那么,是否可以尝试使用多行查找后面?对于同一个问题。@fastlearner不知道您在说什么布特,你不需要在这里留神。