2017-04-02 87 views
0

我無法理解以下代碼行中正則表達式的含義。在r中解析sub和gsub的正則表達式

author = "10_1 A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<" 

# after some experiment, it looks like this line captures whatever is in 
# front of the underscore. 
authodid = sub("_.*","",author) 

# this line extracts the number after the underscore, but I don't know 
# how this is achieved 
paperno <- sub(".*_(\\w*)\\s.*", "\\1", author) 

# this line extracts the string after the numbers 
# I also have no idea how this is achieved through the code 
coauthor <- gsub("<","",sub("^.*?\\s","", author)) 

我已經在網上看到第一個參數是模式,第二個是替換,第三個是對象操作。我也在SO上看到了一些帖子,並得知\\w表示一個字,\\s是一個空格。

但是,有幾件事情還不清楚。 \\w表示單詞,是否表示下一個單詞?如果不是,我應該如何解釋?我瞭解到^匹配字符串的開始,但^之後的那段時間呢?

更重要的是,什麼是_.*的解釋.*_^.*?\\s怎麼樣?我應該如何閱讀它們?

謝謝!

+3

在這裏鍵入這些東西https://regex101.com – rawr

+0

@rawr我應該選擇哪種味道?似乎所有人都顯示錯誤。 – Waht

+1

[pcre應該沒問題](https://regex101.com/r/sIb7Ql/1),我沒有得到一個錯誤,也許你是因爲雙\這是不需要的,當你使用這個網站 – rawr

回答

1

好吧。有很多問題。首先要做的事情。

sub("_.*","",author)尋找_以及其後的所有內容。所以在你的情況下_.*對應於_1 A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<。函數sub以''復位(因此,事實上它會將其刪除),所以最終結果爲10

sub(".*_(\\w*)\\s.*", "\\1", author)比較棘手(沒有任何理由)。它不提取任何東西。如果將代碼替換爲sub(".*_(\\w*)\\s.*", "222", author),結果將爲222(而不是1)。所以,無論你放在第二個參數中,你都會得到結果。爲什麼如此?那麼,因爲".*_(\\w*)\\s.*"對應整個字符串,即:.*_對應於10_; (\\w*)對應於1,最後\\s.*意味着空間和它後面的所有內容(所以,字符串的其餘部分)。

gsub("<","",sub("^.*?\\s","", author))有兩個功能。第一個sub("^.*?\\s","", author)。它看起來從頭到腳都是一切。所以^.*?\\s代表10_1並將其刪除。所以,你最終得到A Kumar; Ahmed Hemani ; Johnny &Ouml;berg<。第二個從各地刪除'<'。

我希望它有幫助。

+0

是否正確:'_。*'在'_'之後查找所有內容,並對其進行操作,'。* _'在'_'之前查找所有內容並對其執行操作,'^。*?'外觀從一開始直到它找到指定的東西(在我的情況下,'\\ s',一個空格)並對其進行操作? – Waht

+0

@短答案是肯定的。 – Vyga