2016-01-24 63 views
1

我有一組文件,其中包含(可能)不同種類的有序列表。我想將任何列表實例摺疊爲段落文本,並將#除去。即用於匹配R中各種類型編號列表的正則表達式

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

將成爲:

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

我也可以想像情況下,這將是有用的這樣的列表中提取到一個單獨的[R對象(例如,我們可能要考慮一個文本,創建列表列表存儲每個列表項目)。 (即,假設併發列表項目在同一列表中,則以前的項目將成爲列表中的3個項目)。

這樣做的一些指導Pythonhere但我想知道如何操縱這樣的名單在R

到目前爲止,我的嘗試是非常粗略的,例如,建築上的無序列表情況gsub("(\r?\n|\r)\\*", " ", stri1)

+0

如果您將文本閱讀爲「gsub(」(?m)\ n?^ [a-zA-Z0-9] + \\。\\ s +「,」「,text,perl = T)一弦。 –

+0

謝謝@WiktorStribiżew,因此適用於「x」。我剛剛根據鏈接的Python頁面更新了示例,我也對其他類型的列表格式感興趣,特別是(x)和x)符號。所以我們有a/i/1/1.1編號,plus(),)和。格式。 – sjgknight

+0

所以這需要進一步,但(x)仍然存在,並且在'1.1'風格上,第二個數字不會被刪除: 'gsub(「\\ r(?m)\ n?^ [ A-ZA-Z0-9] + \\ |。\\ r \ñ^ [A-ZA-Z0-9] + \\)(M +)|???\\ N(M)\ n^[ a-zA-Z0-9] + \\。\\ n(?m)\ n?^ [a-zA-Z0-9] + \\)「,」「,test,perl = T)' – sjgknight

回答

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)

+0

謝謝,我想我期待的名單將導致: [[1]] [1]您好 [2]世界 [3] 3000 任何後續炭名單將創造新的列表'Gsub'來。創建一致的列表類型(例如,所有的1. 2. 3.等)可能是明智的,然後我忘記了可能在\ n [0-9]中讀取的'strsplit'或其他東西 – sjgknight