正则表达式匹配所有出现的段落

时间:2017-11-23 06:10:43

标签: python regex

语言:python

我正在尝试匹配此段落的所有匹配项,并将其从文件中删除。

我无法弄清楚如何为它做正则表达式。

正则表达式,它不起作用

^#--- Maintenance ---#[\s\S]*[^#--- Maintenance ---#]

代码是什么样的

#--- Maintenance ---#
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /home/fuelvnga/public_html/.htpasswd
Require valid-user
#--- Maintenance ---#

fsadfdsaf
dsaf
dsaf
sdaf
sda
fsa
f

#--- Maintenance ---#
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /home/fuelvnga/public_html/.htpasswd
Require valid-user
#--- Maintenance ---#


sdf safd sad

      #--- Maintenance ---#
      AuthType Basic
      AuthName "Restricted Content"
      AuthUserFile /home/fuelvnga/public_html/.htpasswd
      Require valid-user
      #--- Maintenance ---#

我需要突出显示以下所有实例,即使它有缩进和其他奇怪的东西。

我想对评论进行正则表达,因为中间的内容可以更改

#--- Maintenance ---#
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /home/fuelvnga/public_html/.htpasswd
Require valid-user
#--- Maintenance ---#

1 个答案:

答案 0 :(得分:1)

使用

re.sub(r"#--- Maintenance ---#(?:.*?)#--- Maintenance ---#", "",text,0, flags=re.M|re.S)

这会将匹配替换为""。匹配是在您的评论#--- Maintenance ---##--- Maintenance ---#上开始/停止,以及其间的任何字符都是非贪婪的。

诀窍是给出标志re.DOTALL(简称:re.S),它也会使点匹配换行符。非贪婪很重要,只能在两条评论之间进行匹配,而不是在第一条评论的开始和最后一条评论的结尾之间跨越所有文本。

在代码中我留下了多行标志,但这个正则表达式不需要它。

import re

text = """
#--- Maintenance ---#
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /home/fuelvnga/public_html/.htpasswd
Require valid-user
#--- Maintenance ---#

fsadfdsaf
dsaf
dsaf
sdaf
sda
fsa
f

#--- Maintenance ---#
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /home/fuelvnga/public_html/.htpasswd
Require valid-user
#--- Maintenance ---#


sdf safd sad

      #--- Maintenance ---#
      AuthType Basic
      AuthName "Restricted Content"
      AuthUserFile /home/fuelvnga/public_html/.htpasswd
      Require valid-user
      #--- Maintenance ---#

"""

matsch = re.sub(r"#--- Maintenance ---#(?:.*?)#--- Maintenance ---#", "",text,0, flags=re.M|re.S)
print (matsch)

你使用非贪婪匹配,它应匹配两个维护块之间的任何内容。

输出:

fsadfdsaf
dsaf
dsaf
sdaf
sda
fsa
f




sdf safd sad