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+
逐字匹配{
非捕获组(?:
匹配后跟1+位的字符串\s+keypoint\u flip\u排列:\d+
重复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+
逐字匹配{
非捕获组(?:
匹配后跟1+位的字符串\s+keypoint\u flip\u排列:\d+
重复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如果你删除它不匹配的分组部分,请参阅。你可以使用()
而不是(?:)
,但是您将捕获组中数据的最后一次迭代,您不需要这些迭代,请参见