2016-07-20 97 views
0

括號我使用正則表達式R.兩個空格

我的問題選擇子有點類似this one,但我需要一個更具體的解決方案。我有一個角色矢量。每個字符串的格式如下:

"text text1  text2 text3" 

在文本塊之間有大量空白。我想從每個字符串中提取text1。 Text1在任何一邊總是至少有兩個空格,但其他所有文本塊也是如此。 Text1將會像「Monty Python」這樣的名字:可能包含一個空格,但不會有兩個空格。

我使用stringr,而str_extract函數僅提取模式的第一次出現。但我不知道如何指定我的模式。我試過str_extract(z, "\\s{2,}[a-z]*\\s{2,}"),表明我希望至少有一個字母在空格之間。這導致了NAs。有沒有辦法隔離text1?

+0

你的榜樣串對 「text1」 中的每1米側的空間。 '\\ s {2,} [az] * \\ s {2,}「'表示查找至少2個空格字符,後跟零個或多個小寫字母(a - z),然後兩個或更多空白字符。用你的示例字符串,這個模式不會有匹配,因爲沒有一個單詞在每一邊都有2個空格,並且只有一個單詞(即'text')只有小寫字母。 – Jota

+0

對不起,我的問題並不清楚 - 「text1」在我輸入時確實有多個空格,但問題只顯示單個空格。謝謝你們對小寫字母的介紹。將''\\ s {2,} [A-Z] *。* [A-Z]。* [a-z] * \\ s {2,}「'爲我正在嘗試的工作? – Anshu

+0

你能提供一些示例字符串嗎?爲什麼不只是搜索「text1」或者你的目標字符串是什麼?你爲什麼需要正則表達式? – Jota

回答

1

您需要確認字母大小寫,因爲您的子字符串可以包含小寫字母,並且包含可選的組構造以匹配子字符串的第二個字詞實例。

字符向量(基於關閉您輸入的說明):

x <- c('foo Monty Python  baz  quz', 
     'foo Monty  baz   quz') 

使用stringr包:

str_trim(str_extract(x, "\\s{2,}[a-zA-Z]+([a-zA-Z]+)?\\s{2,}")) 
# [1] "Monty Python" "Monty" 

使用在基R中的正則表達式:

trimws(regmatches(x, gregexpr('\\s{2,}[a-zA-Z]+([a-zA-Z]+)?\\s{2,}', x))) 
# [1] "Monty Python" "Monty" 

雖然,我只是簡單地使用strsplit這裏:

sapply(strsplit(x, '\\s{2,}'), '[', 2) 
# [1] "Monty Python" "Monty"