2013-07-19 206 views
1

一個非常微不足道的問題 - 嘗試了幾次迭代,仍然無法得到正確的答案。也許「grep」不是正確的命令,或者我的理解完全失敗。準確字符串匹配

我有一個字符串:

"Part 2.2 are Secondary objectives of this study". 

我試圖做一個精確匹配:「二級目標」。我以爲我可以在這裏使用「fixed = TRUE」,但它與兩者都匹配。

> str5 = "Part 2.2 are Secondary objectives of this study" 
> line<-grep("Secondary objectives",str5,fixed=TRUE) 
> line 
[1] 1 

> str5 = "Part 2.2 are Secondary objectives of this study" 
> line<-grep("Secondary objective",str5,fixed=TRUE) 
> line 
[1] 1 

據我所知,「grep」的操作與其應該完全相同。它正在搜索字符串「輔助目標」,這在技術上是原始字符串中的。但是我的理解是我可以使用「fixed = TRUE」命令完成匹配,但顯然我錯了。

如果「grep」與「fixed = TRUE」不是完全匹配的正確命令,工作?「str_match」也沒有工作 如果我的模式是:「次要目標」,它應該返回「整數(0)」 但如果我的模式是「次要目標」,它應該返回1.

任何輸入,非常感謝感謝很多 - 西馬克


更新:!下面試行阿倫的建議 - 爲工作正常是。

str5 = "Part 2.2 are Secondary objectives of this study" 
> grep("(Secondary objectives)(?![[:alpha:]])",str5, perl=TRUE) 
[1] 1 

> grep("(Secondary objective)(?![[:alpha:]])",str5, perl=TRUE) 
integer(0) 

STR5 = 「2.2部分是本研究的次要目標」 grep的( 「(PAT)([[:阿爾法:]]?!)」,STR5,PERL = TRUE) 整數( 0)

However when I did this: 

> str5 = "Part 2.2 are Secondary objectives of this study" 
> pat <- "Secondary objectives" 
> grep("(pat)(?![[:alpha:]])",str5, perl=TRUE) 
integer(0) 

Thought I can call "pat" inside "grep". Is that incorrect? Thanks! 
+0

我告訴你這樣做:'拍< - paste0( 「(」, 「次要目標」, 「)」, 「?!([:阿爾法:]])」)'並嘗試'grep(pat,str5,perl = TRUE)' – Arun

+0

是的,試過了。 Did not work either ..... – BRZ

+0

你是什麼意思不起作用?它給了'次級目標'的'整數(0)'和'次級目標'的'1'。對我來說這似乎很好! – Arun

回答

1

一個我能想到的方法是使用negative lookahead(與perl=TRUE選項)。也就是說,我們檢查在你的模式之後是否沒有其他字母,如果是的話返回1否則不匹配。

grep("(Secondary objective)(?![[:alpha:]])", x, perl=TRUE) 
# integer(0) 

grep("(Secondary objectives)(?![[:alpha:]])", x, perl=TRUE) 
# [1] 1 

This'd工作,即使您正在搜索的模式是在年底,因爲我們要搜索什麼,這不是一個字母。也就是說,

grep("(this stud)(?![[:alpha:]])", x, perl=TRUE) 
# integer(0) 

grep("(this study)(?![[:alpha:]])", x, perl=TRUE) 
# [1] 1 
+0

感謝Arun的迴應。直接在grep語句中傳遞字符串時它工作正常。但是,如果我通過變量傳遞模式,則grep返回0. str5 =「2.2部分是本研究的次要目標」 pat < - 「次要目標」 grep(「(pat)(?![[:alpha:] ])「,str5,perl = TRUE) 語法不正確?感謝:Simak – BRZ

+0

不確定,但嘗試使你的模式像這樣:'str < - 「次要目標」;; pat < - paste0(「(」,str,「)」,「(?![[:alpha:]])」)'。 – Arun

+0

@Arun是否有一些使用單詞邊界匹配的方法? '\ b'我不確定,因爲我不是很擅長於正則表達式 –