0

我试图提出一个正则表达式,它与我拥有的文本文件中的文章排列的特定模式相匹配。(注意:“|”表示段落标记/换行符,而“.”表示一些非单词字符。)这是模式

| 
...........................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”或“All Rights Reserved”[\W]+(Alle Rechte vorbehalten|All Rights Reserved)
  7. 匹配行尾(最后一行)$

因此,整个 RE 是^[\r\n][\W]+Dokument \d{1,} von \d{1,}[\r\n]+[\w\W]+[\r\n][\W]+(Alle Rechte vorbehalten|All Rights Reserved)$

我已经用文本板对其进行了测试。当我使用 RE 进行向后搜索时,它匹配任何单篇文章(根据需要)。但是当我进行前向搜索时,它会匹配整个文档。

起初我认为它匹配任何文章,然后看起来它匹配所有内容。但后来我尝试了替换选项,结果我的测试词只被替换了一次。

所以RE没有做它的工作。我已经为此工作了一段时间,但找不到我的错误。

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

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

干杯,安德鲁

4

1 回答 1

1

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

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

只是为了重新迭代假设:

  • 以换行符开头,然后是非单词字符的行,然后是“Dokument”
  • 包含一个充满任何字符的主体。
  • 以换行符结尾,然后是非单词字符的行,然后是“版权”,然后是更多字符和换行符。
  • 可以选择包含多行字符,后跟换行符。
于 2015-06-05T10:16:02.160 回答