正则表达式:匹配特定模式之间的任

时间:2015-06-05 09:40:57

标签: python regex textpad

我正在尝试提供一个正则表达式,该表达式匹配我所安排的文本文件中的文章的特定模式。  (注意:“|”表示段落标记/换行符,而“。”表示一些非单词字符。)这是模式

| 
...........................Dokument.1.von.55|
| 
|
|
..........................Some newspaper| 
| 
..........................Freitag 08. Mai 2015 
|
sometextsometextsometextsometextsometextsometextsometextsometextsometextsometext
sometextsometextsometextsometextsometextsometextsometextsometextsometextsometext
(etc..)
|
METAINFO1: IWOIOWIEOWEIWOEIWEO
| 
(etc... possibly more metainfo all capitalized) 
|
| 
.........................Copyright 2015 some publisher notes 
.........................at most one more single line containing copyright information
.........................Alle Rechte vorbehalten| 
# note: last line alternatively: All Rights Reserved 


|
(next pattern i.e. article) 

(我必须将其匿名用于版权目的)

我创建了以下正则表达式来提取单篇文章:

  1. 匹配该行的开头,后跟换行符^[\r\n]
  2. 匹配包含“Dokument ....”的行,前面是非单词字符[\W]+Dokument \d{1,} von \d{1,}
  3. 匹配任意数量的换行符[\r\n]+
  4. 匹配任何单词和非单词字符(即文章的文字)[\w\W]+
  5. 匹配最终换行符(下一个模式开始前的最后一行)[r\n]
  6. 匹配任何非单词字符和字符串“Alle Rechte vorbehalten”或“保留所有权利”[\W]+(Alle Rechte vorbehalten|All Rights Reserved)
  7. 匹配行尾(最后一行)$
  8. 因此,整个RE是^[\r\n][\W]+Dokument \d{1,} von \d{1,}[\r\n]+[\w\W]+[\r\n][\W]+(Alle Rechte vorbehalten|All Rights Reserved)$

    我用Textpad测试过它。当我使用RE进行向后搜索时,它匹配任何单个文章(根据需要)。但是当我进行前向搜索时,它与整个文档相匹配。

    起初我认为它匹配任何文章,然后看起来如果它匹配一切。但后来我尝试了替换选项,结果是我的测试术语只被替换一次。

    所以RE没有做好自己的工作。我一直在研究这个问题已经有一段时间但是找不到我的错误。

    我做错了什么? - 我的RE中有错误吗?

    我打算匹配文章,将工作RE转换为捕获组,然后用一些xml替换它。但我被困在这里。

    干杯, 安德鲁

1 个答案:

答案 0 :(得分:1)

诀窍是制作与文章正文非贪婪相匹配的部分,并为文章定义非常明确的开始和结束匹配。

re.compile(r'^\n\W+Dokument.+?\n\W+Copyright[^\n]+\n(?:[^\n]+\n)?', flags=re.S)

重新思考这些假设:

  • 以换行符开头,后跟一行非字字符后跟" Dokument"
  • 包含一个充满任何字符的正文。
  • 以换行符结尾,后跟一行非字符后跟"版权所有"接下来是更多字符和换行符。
  • 可以选择再包含一行字符,后跟换行符。