Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换为多行正则表达式_Python_Regex - Fatal编程技术网

Python 替换为多行正则表达式

Python 替换为多行正则表达式,python,regex,Python,Regex,给定以下文本,我想删除data\u augmentation\u options{random\u horizontal\u flip{..} (…表示下文中的其他文本) i、 例如,输入为: ... batch_size: 4 num_steps: 30 data_augmentation_options { random_horizontal_flip { keypoint_flip_permutation: 0 keypoint_flip_p

给定以下文本,我想删除
data\u augmentation\u options{random\u horizontal\u flip{..}
表示下文中的其他文本)

i、 例如,输入为:

  ...
  batch_size: 4
  num_steps: 30
  data_augmentation_options {
    random_horizontal_flip {
      keypoint_flip_permutation: 0
      keypoint_flip_permutation: 2
      keypoint_flip_permutation: 1
      keypoint_flip_permutation: 4
      keypoint_flip_permutation: 3
      keypoint_flip_permutation: 6
      keypoint_flip_permutation: 5
      keypoint_flip_permutation: 8
      keypoint_flip_permutation: 7
      keypoint_flip_permutation: 10
      keypoint_flip_permutation: 9
      keypoint_flip_permutation: 12
      keypoint_flip_permutation: 11
      keypoint_flip_permutation: 14
      keypoint_flip_permutation: 13
      keypoint_flip_permutation: 16
      keypoint_flip_permutation: 15
    }
  }

  data_augmentation_options {
    random_crop_image {
      min_aspect_ratio: 0.5
      max_aspect_ratio: 1.7
      random_coef: 0.25
    }
  }

  ...
预期产出为:

  ...
  batch_size: 4
  num_steps: 30

  data_augmentation_options {
    random_crop_image {
      min_aspect_ratio: 0.5
      max_aspect_ratio: 1.7
      random_coef: 0.25
    }
  }
  ...
我试过了

s=''' ...
      batch_size: 4
      num_steps: 30
      data_augmentation_options {
        random_horizontal_flip {
          keypoint_flip_permutation: 0
          keypoint_flip_permutation: 2
          keypoint_flip_permutation: 1
          keypoint_flip_permutation: 4
          keypoint_flip_permutation: 3
          keypoint_flip_permutation: 6
          keypoint_flip_permutation: 5
          keypoint_flip_permutation: 8
          keypoint_flip_permutation: 7
          keypoint_flip_permutation: 10
          keypoint_flip_permutation: 9
          keypoint_flip_permutation: 12
          keypoint_flip_permutation: 11
          keypoint_flip_permutation: 14
          keypoint_flip_permutation: 13
          keypoint_flip_permutation: 16
          keypoint_flip_permutation: 15
        }
      }
    
      data_augmentation_options {
        random_crop_image {
          min_aspect_ratio: 0.5
          max_aspect_ratio: 1.7
          random_coef: 0.25
        }
      }
      ...
'''
print(re.sub('data_augmentation_options \{[\s]+random_horizontal_flip[\s]+\{[\s]+(keypoint_flip_permutation: \d[\s])+[\s]+\}[\s]+\}','',s,flags=re.S))

它似乎不起作用,实现这一点的正确方法是什么?

您只匹配一条正弦线,而不是所有的线

您可以重复此格式的行
keypoint\u flip\u permutation:\d+
,并匹配两个闭合卷发

注意您不需要
re.S
,因为图案中没有点

data_augmentation_options {\s+random_horizontal_flip\s+{(?:\s+keypoint_flip_permutation: \d+)+\s*}\s*}\s*
解释

  • data\u augmentation\u选项{
    按字面匹配
  • \s+随机\u水平\u翻转\s+
    匹配起始线
  • {
    逐字匹配
  • (?:
    非捕获组
    • \s+keypoint\u flip\u排列:\d+
      匹配后跟1+位的字符串
  • )+
    重复1+次
  • \s*}
    匹配可选空格字符和
    }
  • \s*}
    匹配可选空格字符和
    }
  • \s*
    匹配可选空白字符
如果只想删除尾随的换行符,可以在末尾匹配
\r?\n
,而不是
\s*

|

比如说

print(re.sub(r"data_augmentation_options {\s+random_horizontal_flip\s+{(?:\s+keypoint_flip_permutation: \d+)+\s*}\s*}\s*", "", s))

您只匹配一条sinlge线,而不是所有的线

您可以重复此格式的行
keypoint\u flip\u permutation:\d+
,并匹配两个闭合卷发

注意您不需要
re.S
,因为图案中没有点

data_augmentation_options {\s+random_horizontal_flip\s+{(?:\s+keypoint_flip_permutation: \d+)+\s*}\s*}\s*
解释

  • data\u augmentation\u选项{
    按字面匹配
  • \s+随机\u水平\u翻转\s+
    匹配起始线
  • {
    逐字匹配
  • (?:
    非捕获组
    • \s+keypoint\u flip\u排列:\d+
      匹配后跟1+位的字符串
  • )+
    重复1+次
  • \s*}
    匹配可选空格字符和
    }
  • \s*}
    匹配可选空格字符和
    }
  • \s*
    匹配可选空白字符
如果只想删除尾随的换行符,可以在末尾匹配
\r?\n
,而不是
\s*

|

比如说

print(re.sub(r"data_augmentation_options {\s+random_horizontal_flip\s+{(?:\s+keypoint_flip_permutation: \d+)+\s*}\s*}\s*", "", s))

对正则表达式进行一些修改,使其成为

data_augmentation_options {\s+random_horizontal_flip\s+{(\s+keypoint_flip_permutation:\s\d+\s)+\s+}\s+}
  • [\s]
    替换为
    \s
    ,这相当于
  • \s+
    放入捕获组
    ()
  • \d
    替换为
    \d+
    ,以匹配多位数

    • 对正则表达式进行一些修改,使其成为

      data_augmentation_options {\s+random_horizontal_flip\s+{(\s+keypoint_flip_permutation:\s\d+\s)+\s+}\s+}
      
      • [\s]
        替换为
        \s
        ,这相当于
      • \s+
        放入捕获组
        ()
      • \d
        替换为
        \d+
        ,以匹配多位数

      您可以使用前瞻功能在第二个模式停止删除:

      >>> re.sub(r'^[ \t]*data_augmentation_options[\s\S]+?(?=^[ \t]*data_augmentation_options)','\n\n',s, flags=re.M)
      
              batch_size: 4
              num_steps: 30
              
      
              data_augmentation_options {
                  random_crop_image {
                      min_aspect_ratio: 0.5
                      max_aspect_ratio: 1.7
                      random_coef: 0.25
                  }
              }
      
      (?=^[\t]*数据扩充选项)
      是前瞻


      您可以在第二个模式中使用前瞻停止删除:

      >>> re.sub(r'^[ \t]*data_augmentation_options[\s\S]+?(?=^[ \t]*data_augmentation_options)','\n\n',s, flags=re.M)
      
              batch_size: 4
              num_steps: 30
              
      
              data_augmentation_options {
                  random_crop_image {
                      min_aspect_ratio: 0.5
                      max_aspect_ratio: 1.7
                      random_coef: 0.25
                  }
              }
      
      (?=^[\t]*数据扩充选项)
      是前瞻


      字符串输入看起来像json,可能更容易加载为json,删除数据,然后再将其变为json?字符串输入看起来像json,可能更容易加载为json,删除数据,然后再将其变为json?我可以知道使用
      添加
      ?:
      ?@william007的目的是什么吗(?:
      意味着一个非捕获组,因此,
      +
      在它作为一个整体重复之后。我对解释做了一个小的更新。但是看起来即使我省略了
      (?:
      它也可以工作,包括它有什么好处?@william007如果你删除它不匹配的分组部分,请参阅。你可以使用
      ()
      而不是
      (?:)
      ,但是您将捕获组中数据的最后一次迭代,这是您不需要的,请参阅我可以知道使用
      添加
      ?:
      ?@william007的目的吗(?:
      意味着一个非捕获组,因此,
      +
      在它作为一个整体重复之后。我对解释做了一个小的更新。但是看起来即使我省略了
      (?:
      它也可以工作,包括它有什么好处?@william007如果你删除它不匹配的分组部分,请参阅。你可以使用
      ()
      而不是
      (?:)
      ,但是您将捕获组中数据的最后一次迭代,您不需要这些迭代,请参见