我正在尝试编写一个简单的脚本,它将从一堆Python源代码文件(以及其他内容)中删除预先存在的头块。例如:
##########################################
## This is a header block that
## I want to erase.
## It occurs at the top of a file,
## has a variable number of lines,
## and maybe some blank ones thrown in, like
##
########################################
this is some code that needs to be preserved
# and a comment I don't want touched
followed by some more code...
我目前的方法是使用一个正则表达式来抓取整个块,sub
使用空字符串,如下所示:
regex = re.compile("^#.*$\n", re.MULTILINE)
regex.sub('', filetext, count=1)
我在re
字符串上尝试了一百种变体,包括:
"^#.*"
"^#+.*"
"^#.*\n"
...
但是只删除了块的第一行(顶部的'#'行)。 Python的在线文档说
the pattern character '^' matches at the beginning of the string and at the
beginning of each line (immediately following each newline);
对我而言意味着它将在单个匹配中包含与给定模式匹配的所有连续行。显然,我对re.MULTILINE的理解是错误的,或者我写错了正则表达式。有人可以帮助我了解正在发生的事情并完成我正在尝试做的事情吗?感谢。
答案 0 :(得分:0)
您不需要使用多线模式,因为它是标题,您可以使用:
^(?:\s*#.*\r?\n)*
如果没有多线模式,^
的含义只是“字符串的开头”。先前模式将匹配以#
开头的字符串开头的所有连续行(前面可能有空格)。
理解这种模式最重要的是默认情况下.
匹配除换行之外的任何字符。我在非捕获组的末尾放置了一个CRLF (即\r?\n
),以使非捕获组能够重复。
当正则表达式引擎冒出一条不以以下方式开头的行:可能的空格+尖锐时,匹配结束。
然而,由于我在非捕获组的开头使用\s*
(匹配包括垂直白空间的任何空格,如\n
),模式可以匹配类似的东西:
#############
# header
#############
###############
# someting else if there is nothing that starts
# a newline with an other character than "#"
###############
(换句话说,请注意\s
可以匹配换行符。但是,如果您要禁止此行为,可以使用[^\S\r\n]
代替\s
。)的
我不认为您对多线模式的理解是错误的,但我认为使用多线模式查找连续线并不是最好的选择。
答案 1 :(得分:0)
您将正则表达式替换限制为此行中仅最多1次替换:
regex.sub('', filetext, count=1)
摆脱count=1
:
regex.sub('', filetext)
count
参数限制了文档中的最大替换次数:
可选参数count是要替换的模式最大出现次数; count必须是非负整数。如果省略或为零,则将替换所有出现的内容。