python - 用正则表达式替换多行
问题描述
鉴于以下文字,我想删除所有内容data_augmentation_options{..}
即,输入是:
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
我试过了
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,flags=re.S))
它似乎不起作用,实现这一目标的正确方法是什么?
解决方案
而不是删除你不想要的东西,你可以捕获你想要的东西:
>>> re.findall(r'batch_size: *\d+|num_steps: *\d+',s)
['batch_size: 4', 'num_steps: 30']
或者,如果您想捕获前导空格:
>>> re.findall(r'^[ \t]*(?:batch_size:|num_steps:)[ \t]*\d+',s, flags=re.M)
['\t\t\tbatch_size: 4', '\t\t\tnum_steps: 30']
然后打印结果:
>>> print('\n'.join(re.findall(r'^[ \t]*(?:batch_size:|num_steps:)[ \t]*\d+',s, flags=re.M))
batch_size: 4
num_steps: 30
如果你想使用re.sub
,你可以使用一个冲突的字符类,它将匹配匹配后的任何和所有字符。冲突的字符类类似于[\s\S]
空格或非空格字符:
>>> re.sub(r'data_augmentation_options[\s\S]*','',s)
batch_size: 4
num_steps: 30
也许更简单的方法是将 Python 的str.partition与要用作分隔符的字符串一起使用:
>>> s.partition('data_augmentation_options')[0]
batch_size: 4
num_steps: 30
推荐阅读
- github - 带有选项的 IntelliJ Github 登录令牌?
- azure-active-directory - 如何通过 Azure AD 检查用户是否在 AD 组中?
- java - JAVA用.compareTo对向量进行排序并填充另一个向量
- php - Laravel - 多态关系不起作用
- python - Matplotlib 相邻图
- angular - Angular 7 - 浏览器刷新总是重定向到主页
- python - 类二叉搜索树 Python
- javascript - 为什么我的删除单元格变量没有删除最后插入的行?
- ios - Cocoapods 没有正确设置搜索路径
- selenium - 如何使用功能在 BrowserStack 中允许麦克风