2012-07-28 86 views
6

我有一個字符向量,這是一些PDF通過pdftotext(命令行工具)抓取的文件。這個空白在哪裏隱藏?

一切都(很幸福)很好地排隊。但是,向量充滿了一種空白的那逃避我的正則表達式:

> test 
[1] "Address:"    "Clinic Information:" "Store "    "351 South Washburn" "Aurora Quick Care"  
[6] "Info"     "St. Oshkosh, WI 54904" "Phone: 920‐232‐0718" "Pewaukee" 

> grepl("[0-9]+ [A-Za-z ]+",test) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

> dput(test) 
c("Address:", "Clinic Information:", "Store ", "351 South Washburn", 
"Aurora Quick Care", "Info", "St. Oshkosh, WI 54904", "Phone: 920‐232‐0718", 
"Pewaukee") 

> test.pasted <- c("Address:", "Clinic Information:", "Store ", "351 South Washburn", 
+     "Aurora Quick Care", "Info", "St. Oshkosh, WI 54904", "Phone: 920‐232‐0718", 
+     "Pewaukee") 

> grepl("[0-9]+ [A-Za-z ]+",test.pasted) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 

> Encoding(test) 
[1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" 

> Encoding(test.pasted) 
[1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "UTF-8" "unknown" 

顯然有這不是在dput得到分配的一些角色,如下面的問題:

How to properly dput internationalized text?

我無法複製/粘貼整個矢量....我如何搜索並摧毀這個非空白空白?

編輯

顯然我是不是甚至接近清楚,因爲答案是所有的地方。這裏有一個更簡單的測試用例:

> grepl("Clinic Information:", test[2]) 
[1] FALSE 
> grepl("Clinic Information:", "Clinic Information:") # Where the second phrase is copy/pasted from the screen 
[1] TRUE 

有單詞「診所」和「信息」顯示在屏幕上,並在dput輸出之間的空單,但無論是在字符串中是不是一個標準的空間。我的目標是消除這個,所以我可以正確地把這個元素搞清楚。

+0

空白不在矢量本身中,它只是以它的顯示方式。 – 2012-07-28 17:07:43

+0

看看'lapply(test [4],utf8ToInt)',看看裏面是否有大數字。 – 2012-07-28 17:37:39

+0

@AlanCurry'> lapply(test [4],utf8ToInt) [1] 51 53 49 160 83 111 117 116 104 160 87 97 115 104 98 117 114 110' – 2012-07-28 20:35:37

回答

5

升級我一個答案評論:

你的字符串包含非換空間(U + 00A0)當您粘貼它該被記到正常空間。以Unicode匹配所有的怪類空字符,很容易與Perl樣式的正則表達式:

grepl("[0-9]+\\p{Zs}[A-Za-z ]+", test, perl=TRUE) 

Perl的正則表達式語法是\p{categoryName},額外的反斜槓是包含一個反斜槓的字符串的語法的一部分, 「Zs」是「分隔符」Unicode類別,「空間」子類別。對於U + 00A0字符,更簡單的方法是

grepl("[0-9]+[ \\xa0][A-Za-z ]+", test) 
+0

我很困惑。 test [2]無論如何都不匹配,它沒有數字來匹配[0-9]部分。 – 2012-07-28 21:22:42

+0

你當然是對的。應該在盲目運行之前閱讀正則表達式。一旦我得到有問題的數字,完美的工作,謝謝! – 2012-07-28 21:29:59

1

我認爲你在追蹤和領先的白色空間之後。如果是這樣,也許這一功能將工作:

Trim <- function (x) gsub("^\\s+|\\s+$", "", x) 

同時請留意標籤和這樣的,這可能是有用的:

clean <- function(text) { 
    gsub("\\s+", " ", gsub("\r|\n|\t", " ", text)) 
} 

所以要用乾淨,然後修剪,如:

Trim(clean(test)) 

也可以在看出來的短破折號( - )和破折號( - )

+0

我不確定是否正確理解問題。 – 2012-07-28 16:52:35

0
test <- c("Address:", "Clinic Information:", "Store ", "351 South Washburn", 
"Aurora Quick Care", "Info", "St. Oshkosh, WI 54904", "Phone: 920‐232‐0718", 
"Pewaukee") 

> grepl("[0-9]+ [A-Za-z ]+",test) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 


library(stringr) 
test2 <- str_trim(test, side = "both") 

> grepl("[0-9]+ [A-Za-z ]+",test2) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
# So there were no spaces in the vector, just the screen output in this case. 
1

我沒有看到有關空格的任何異常,但電話號碼中的破折號是U+2010 (HYPHEN),而不是ASCII連字符(U+002D)。