用于匹配R中各种类型的编号列表的正则表达式

时间:2016-01-24 08:47:33

标签: regex r list gsub

我有一组文件,其中包含(可能)不同类型的有序列表。我想将任何列表实例折叠为段落文本,并删除#out。即

1. Hello
(a) world
ii) 3000
This isn't in the list.

会变成:

Hello world 3000.
This isn't in the list.

我还可以想象将这些列表提取到单独的R对象中有用的情况(例如,我们可能想要获取文本,创建存储每个列表项的列表列表)。 (即,假设并发列表项位于同一列表中,之前的项目将成为列表中的3个项目。)

Python here中有关于此操作的一些指导,但我想知道如何在R中操作此类列表。

到目前为止,我的尝试非常粗糙,例如建立在无序列表案例gsub("(\r?\n|\r)\\*", " ", stri1)

1 个答案:

答案 0 :(得分:0)

如果您将文件作为一个字符串读取,则可以使用

解决该问题
txt = "1. Hello\r\n(a) world\r\nii) 3000\r\nThis isn't in the list."
txt = gsub("(?m)[\r\n]*^(?:\\d+(?:\\.\\d+)*|\\(?[a-z]+\\))\\s+", " ", txt, perl=T)
lst = strsplit(txt, "\r?\n")

输出:

> txt
[1] "1. Hello world 3000\r\nThis isn't in the list."
> lst
[[1]]
[1] "1. Hello world 3000"     "This isn't in the list."

正则表达式是

(?m)[\r\n]*^(?:\d+(?:\.\d+)*|\(?[a-z]+\))\s+

请参阅regex demo

(?m)强制^匹配行开始位置,[\r\n]*匹配零个或多个\n\r个字符,(?:\d+(?:\.\d+)*|\(?[a-z]+\))匹配用点分隔的整数或数字,或者用(和必修)括起来的一个或多个字母。 \s+匹配一个或多个空白符号。 如果字母/罗马数字可以为大写,请将(?m)替换为(?mi)