我的文件格式总是三行,后面跟一个空行。哪个正则表达式匹配这三行的块?
line1
line2
line3
line4
line5
line6
...
我知道^\s*$
可以匹配只包含空格的行,所以^\s*$(.*)^\s*$
之类的内容应该匹配两个空行之间的内容,但似乎无法正常工作。
答案 0 :(得分:2)
您可以使用from itertools import islice
with open('input') as f:
while True:
lines = [line.strip() for line in islice(f, 4) if line.strip()]
if not lines:
break
print(lines) # or otherwise process them
一次读取4行文件,如果是换行符,则丢弃最后一行:
static function get_pages( $page_slug = '' ) {
$pages = array();
// Default page properties
$default_args = array(
'menu-title' => '',
'tab-title' => '',
'parent' => 'admin.php',
'in-menu' => false,
'has-tab' => true,
'tab-side' => false,
'top-level' => false,
);
$pages['sat-options-general'] = array_merge(
$default_args,
array(
'slug' => 'sat-options-general',
'menu-title' => _x( 'Admin Theme', 'Page title in the menu', 'skizzar_admin_theme' ),
'tab-title' => _x( 'Admin Theme Options', 'Option tab title', 'skizzar_admin_theme' ),
'title' => _x( 'Admin Theme Options', 'Option page title', 'skizzar_admin_theme' ),
'callback' => array( __CLASS__, 'display_general_options_page' ),
'in-menu' => true,
'top-level' => true,
)
);
$pages['sat-addons'] = array_merge(
$default_args,
array(
'slug' => 'sat-addons',
'menu-title' => _x( 'Addons', 'Page title in the menu', 'skizzar_admin_theme' ),
'tab-title' => _x( 'Addons', 'Option tab title', 'skizzar_admin_theme' ),
'title' => _x( 'Browse Addons', 'Option page title', 'skizzar_admin_theme' ),
'callback' => array( __CLASS__, 'display_addons_page' ),
'in-menu' => true,
)
);
// Return
if ( $page_slug ) {
if ( ! isset( $pages[ $page_slug ] ) ) {
return null;
}
return $pages[ $page_slug ];
}
return apply_filters( 'skizzar_admin_theme_tab', $pages, $default_args, $page_slug );
}
<强>演示强>
使用此输入:
line1 line2 line3 line4 line5 line6 line7 line8
输出
['line1', 'line2', 'line3'] ['line4', 'line5', 'line6'] ['line7', 'line8']
这也处理文件结束而没有完整的3行组的情况。
答案 1 :(得分:2)
您可以使用Python的groupby
函数来读取行,直到找到空行,如下所示:
from itertools import groupby
with open('input.txt') as f_input:
for k, g in groupby(f_input, lambda x: x != '\n'):
if k:
print [line.strip() for line in g]
然后,这将读取每三行作为一个块。如果有额外的空行,也会跳过这些行,或者如果块中有超过三行,这些行也会被读作单个块。
这将打印以下内容:
['line1', 'line2', 'line3']
['line4', 'line5', 'line6']