【问题标题】:Is it possible to split this kind of text documents into multiple ones with RegEx?是否可以使用 RegEx 将此类文本文档拆分为多个文档?
【发布时间】:2019-06-21 10:32:24
【问题描述】:

我想将一个大文本文档 (.txt) 拆分为多个。以前有人问过这个问题,但我认为我需要一个特定的正则表达式来完成这项任务。

我尝试了几个“拆分”软件,但我还没有找到满意的解决方案。文本文件是西班牙议会的一堆辩论。文本分为政策倡议(我不确定这是否惯用),我想将其拆分为每个倡议的文档。

有趣的是,每个倡议都有自己的标题,形式如下:

- DEL GRUPO PARLAMENTARIO CATALÁN (CONVERGÈNCIA I UNIÓ), REGULADORA DE LOS HORARIOS COMERCIALES. (Número de expediente 122/000004.)

- DEL DIPUTADO DON MARIANO RAJOY BREY, DEL GRUPO PARLAMENTARIO POPULAR EN EL CONGRESO, QUE FORMULA AL SEÑOR PRESIDENTE DEL GOBIERNO: ¿CÓMO VALORA USTED LOS PRIMEROS DÍAS DE SU GOBIERNO? (Número de expediente 180/000021.)

如您所见,每个标题都是大写的,它以减号开头并以XXX/XXXXXX.)(其中 X 是一个数字)、一个点和一个右括号结尾。每个标题都彼此不同。我虽然做了一些正则表达式来捕捉这些特征,以便在这些辩论之间有一个分隔符,但老实说我不知道​​该怎么做。

理想的做法是选择标题和它下面的辩论,直到出现另一个标题并用它制作一个新文档,所以最后我可以在一个文档中包含带有标题和自己的辩论的政策倡议。

那么,这可以通过 RegEx 解决方案来完成吗?我需要什么样的软件才能做到这一点? Notepad++ 够用吗?

【问题讨论】:

  • 您使用什么语言/工具?你试过什么?什么没用?你得到了什么?你期待什么?

标签: regex text split


【解决方案1】:

这是一个简单的 Awk 尝试。

awk '/^- DEL .+ \(Número de expediente [1-9][0-9]*\/[0-9]+\.\)$/ {
        if (p) close (p)
        p = sprintf("split%05i.txt", ++i) }
    { print > p }' inputfile.txt

您对“全大写”的定义似乎并不完全明确,所以我作弊了;你可能想调整我的假设。您的 Awk 可能无法将 É 等识别为大写,这也可能取决于您的语言环境。

【讨论】:

  • 非常感谢您的帮助!不过,我有一些问题要让它发挥作用。如果我运行你的脚本,它会给我一些0+ 的语法错误。我已经用@Opsse 给我的那个正则表达式更改了:^\-.+\d{3}\/\d{6}\.\)$。现在它创建了一个新文档,但它与输入文件完全相同,所以我不知道我做错了什么。如果打扰到你,我很抱歉。再次,非常感谢。
  • \d 正则表达式在 Awk 中不起作用,它使用不同的正则表达式方言,但如果您切换到 ^-.+[0-9]{3}\/[0-9]{6}\.\)$ 可能会起作用
  • 现在修正了错字,抱歉(忘记转义正则表达式中的反斜杠)。
  • 哦,是的,效果很好!我不得不将文本格式从 DOS 更改为 UNIX,瞧!有效!非常感谢老哥,我真的很感激!祝你好运!
  • Awk 也可以处理 DOS 文件,试试\r?$ 而不是$;当然,正确的解决方法是不使用 DOS。
【解决方案2】:

我建议这个正则表达式匹配标题:

^\-.+\d{3}\/\d{6}\.\)$

我假设标题总是以XXX/XXXXXX.) 结尾,其中X 是一个数字。

您可以使用this tool 进行测试,它还提供有关语法的说明,您可以将代码导出为某些编程语言。

大多数文本编辑器都有一个带有查找工具的“RegEx”选项,但在某些用例中可能还不够。此外,几乎任何编程语言都可以使用 RegEx。

【讨论】:

  • 太好了!事实上,RegEx 对获取这类标题有很大帮助。理想的做法是选择标题和它下面的辩论,直到出现另一个标题并用它制作一个新文件,所以最后我可以在一个文件中包含政策倡议及其标题和自己的辩论。你的评论是一个很好的开始。是的,你认为它是正确的,我已经编辑了我的帖子以使其更清晰。非常感谢!
  • 为此,您可能需要使用编程语言创建脚本。我不能给你一个一般情况,因为任何实现都会不同。
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2012-10-02
相关资源
最近更新 更多