Регулярное выражение для сопоставления различных типов нумерованных списков в R

У меня есть набор файлов с (потенциально) различными видами упорядоченных списков. Я хотел бы свернуть все экземпляры списка в текст абзаца и удалить #. т.е.

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

Станет:

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

Я также могу представить случаи, когда было бы полезно извлечь такие списки в отдельный объект R (например, мы можем захотеть взять текст, создать список списков, в котором хранится каждый элемент списка). (т. е. если предположить, что одновременные элементы списка находятся в одном списке, предыдущие элементы станут 3 элементами в списке).

Некоторые рекомендации по этому поводу приведены в Python здесь но я хотел бы знать, как манипулировать такими списками в R.

Пока мои попытки довольно грубы, например. построение на случае неупорядоченного списка gsub("(\r?\n|\r)\\*", " ", stri1)


person sjgknight    schedule 24.01.2016    source источник
comment
Попробуйте gsub("(?m)\n?^[a-zA-Z0-9]+\\.\\s+", "", text, perl=T), если вы читаете текст как одну строку.   -  person Wiktor Stribiżew    schedule 24.01.2016
comment
Спасибо @WiktorStribiżew, так что это работает для x. на основе списков, я только что обновил пример на связанной странице Python, меня также интересуют другие типы формата списка, в частности нотации (x) и x). Итак, у нас есть нумерация a/i/1/1.1, плюс (), и . форматирование.   -  person sjgknight    schedule 24.01.2016
comment
Так что это идет немного дальше, но (x) остается, а в стиле «1.1» вторая цифра не удаляется: gsub("\\r(?m)\n?^[a-zA-Z0-9]+\\.|\\r(?m)\n?^[a-zA-Z0-9]+\\)|\\n(?m)\n?^[a-zA-Z0-9]+\\.|\\n(?m)\n?^[a-zA-Z0-9]+\\)", "", test, perl=T)   -  person sjgknight    schedule 24.01.2016
comment
Решена проблема 1.1: gsub("\\r(?m)\n?^[a-zA-Z0-9]+\\.+[a-zA-Z0-9]|\\r(?m)\n?^[a-zA-Z0-9]+\\.|\\r(?m)\n?^[a-zA-Z0-9]+\\)|\\n(?m)\n?^[a-zA-Z0-9]+\\.|\\n(?m)\n?^[a-zA-Z0-9]+\\)", "", test, perl=T)   -  person sjgknight    schedule 24.01.2016
comment
Хорошо, это позволяет мне свернуть их все: gsub("\\r(?m)\n?^[a-zA-Z0-9]+\\.+[a-zA-Z0-9]|\\r(?m)\n?^[a-zA-Z0-9]+\\.|\\r(?m)\n?^[a-zA-Z0-9]+\\)|\\n(?m)\r?^[a-zA-Z0-9]+\\.|\\n(?m)\r?^[a-zA-Z0-9]+\\)|\\n(?m)\\r?^\\([a-zA-Z0-9]+\\)|\\r(?m)\\n?^\\([a-zA-Z0-9]+\\)", "", test, perl=T) Читать их в списки тоже было бы весело (но это определенно выше моих сил прямо сейчас)   -  person sjgknight    schedule 24.01.2016


Ответы (1)


Если вы читаете файл как одну строку, вы можете решить это с помощью

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+

См. демонстрацию регулярного выражения.

(?m) заставляет ^ соответствовать начальной позиции строки, [\r\n]* соответствует нулю или более символов \n или \r, (?:\d+(?:\.\d+)*|\(?[a-z]+\)) соответствует либо целым числам, либо цифрам, разделенным точками, либо одной или нескольким буквам, заключенным в опциональные ( и обязательные ). \s+ соответствует одному или нескольким пробельным символам. Если буквы/римские цифры могут быть в верхнем регистре, замените (?m) на (?mi).

person Wiktor Stribiżew    schedule 24.01.2016
comment
Спасибо, я думаю, что список, который я ожидал, приведет к: [[1]] [1] Hello [2] world [3] 3000 Любые последующие списки символов создадут новые списки. Gsub для создания согласованных типов списков (например, все 1. 2. 3. и т. д.), вероятно, имеет смысл, а потом я забыл о strsplit, который мог читать в \n[0-9] или что-то в этом роде. - person sjgknight; 25.01.2016