3

我正在使用 emeditor,我试图从法国维基百科转储 .xml 文件中分离出大约 200 万篇包含关键字 3 的文章(20GB,3.38 亿行,总共 480 万篇文章)。我想保留包含在 2 个关键字(关键字 1 和关键字 2)之间的文本,但前提是其中存在另一个关键字(关键字 3)。

关键字列表:

keyword1 = <page>
keyword2 = </page>
keyword3 = {{Infobox

示例 A:

keyword1 = <page>
text to consider without keyword3
keyword2 = </page>

结果 => 不要提取(或保留或拆分)这部分。

示例 B:

keyword1 = <page>
text to consider with keyword3
keyword2 = </page>

结果 => 提取(或保留或拆分)这部分。

Emeditor 的作者帮助我完成了以下工作:

Find (choose regular expression):
<page>(.*?{{Infobox.*?)</page>
Replace with
\1
And in Advanced... : search in 2500 lines

它似乎总体上工作正常,但有时会出现一些错误:我在这里加入一些小样本:https ://www.cjoint.com/c/JErsTJnVQpD 我还添加了一个小的期望结果 xml 文件。正如您在连接图像中看到的那样,蓝色突出显示的部分(2 篇文章)不应该包含在结果部分中,因为它们没有关键字{{Infobox . 注意:如果标签保留在结果中也会很好。提前致谢 ;)

4

3 回答 3

2

如果您使用EmEditor,在替换对话框中:

  • 寻找: <page>((?:(?!<page>).)*?{{Infobox.*?)</page>
  • 用。。。来代替: <page>\1</page>

确保在单击“提取”按钮的 ▼ 时显示的菜单中选择了“新建文档”。

EmEditor 替换对话框

高级对话框中:

  • 设置正则表达式“。” 可以匹配换行符复选框。
  • 在Additional Lines to Search for Regular Expressions文本框中输入3000(或您需要从一次出现的正则表达式中提取的最大行数)

在此处输入图像描述

最后,单击“替换”对话框中的“提取”按钮。

于 2020-05-17T21:10:50.320 回答
2

留在隐喻关键字中,代替需要
由于有千兆字节,这是最快的方法
尝试:

(?s)keyword1.*?(?:(?:keyword1|keyword2)(*SKIP)(*FAIL)|keyword3).*?(?:keyword1(*SKIP)(*FAIL)|keyword2)

演示

或使用关键字替换:

查找(?s)<page>(.*?(?:(?:<page>|</page>)(*SKIP)(*FAIL)|{{Infobox).*?)(?:<page>(*SKIP)(*FAIL)|</page>)
替换$1

演示

不像某些人那样解释量词是什么——这不是关于它
的期望了解基础知识

于 2020-05-17T20:46:50.283 回答
1

您需要从关键字1关键字3之间的匹配中排除关键字1 。利用

查找内容(?s)<page>((?:(?!<page>).)*?{{Infobox.*?)</page>
替换为\1

这里,

  • (?s)- 一个 DOTALL 修饰符(就像.匹配换行符打开一样)
  • <page>-关键字1文本
  • ((?:(?!<page>).)*?{{Infobox.*?)- 第 1 组:任何字符,0 次或多次出现但尽可能少,不开始<page>字符序列
    • (?:(?!<page>).)*?
    • {{Infobox-关键字2
    • .*?- 尽可能少的任何 0 个或更多字符
  • </page>-关键字2文本
于 2020-05-17T18:58:35.157 回答