我必须在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 )
    {
    ...

但是我的regex做了这样的事情
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 )
        {
        ...

最佳答案

你可以用

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

请参见regex demo
细节
(?m)-re.M标志
^-行的开始
(\s*if\s*)-第一组:if用0+空格括起来
(\(.*(?:\n(?!\s*if\s*\().*)*)-第2组:
\(-a(
.*-线路的其余部分
(?:\n(?!\s*if\s*\().*)*-0次或多次重复
\n(?!\s*if\s*\()-换行符LF,后面不跟if并用0+空格括起来,后面跟着(
.*-线路的其余部分
//\s*-//和0+空格
(\w+)-第3组:1个或多个字字符
\s*$-0+空格和行尾。
Python demo
import re
s = """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
{
..."""
print( re.sub(r'(?m)^(\s*if\s*)(\(.*(?:\n(?!\s*if\s*\().*)*)//\s*(\w+)\s*$', r'\1(\2 || \3)', s) )

输出:
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 - 如何在Python中使用具有字符异常的多行DOTALL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55277811/

10-17 00:36