正则表达式解析文本文档

时间:2012-07-27 23:17:25

标签: python regex

我试图用!if和!endif解析文本文档。我希望文本没有!if,!endif和它们之间的文本。

例如:

text
!if
text1
!endif
text2

我想输出= text + text2 + ..

我试过这样的事情re.findall(r'((^(!if。*!endif))+',text)。但它似乎对我不起作用。

2 个答案:

答案 0 :(得分:4)

你的正则表达式是:

^!if$.*?^!endif$\s+

这说:

^      - Match the beginning of a line (because of the re.M flag)
!if    - Match !
$      - Match the end of a line (because of the re.M flag)
.*?    - Match any number of characters (non-greedy) (includes line breaks, because of the re.S flag)
^      - Match the beginning of a line (because of the re.M flag)
!endif - Match !endif
$      - Match the end of a line (because of the re.M flag)
\s+    - Match one or more whitespace characters

所以,你应该能够像这样使用它,用空字符串替换所有出现的上述正则表达式(无):

import re
s = "text\n!if\ntext1\n!endif\ntext2"
s = re.sub("^!if$.*?^!endif$\s+", "", s, flags=re.S | re.M)
print s

will output

text 
text2

请注意,这明确要求!if!endif分开。如果这不是必需的,您可以从正则表达式的中间删除$^锚点。

^!if.*?!endif$\s+

答案 1 :(得分:0)

我可以帮助sed:

sed '/^if$/,/^endif$/ d'

以下是sed使用的算法:

  1. 设置变量match = False
  2. 阅读下一行
  3. 检查线是否相等'如果'。如果是这样,请设置变量match = True
  4. if match == True,检查current-line =='endif'。 如果是这样,设置match = False并删除当前行[并跳转到0]。
  5. 打印当前行
  6. 如果不是EOF,则跳至1