这个空白在哪里隐藏?

问题描述:

我有一个字符向量,这是一些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

升级我一个答案评论:

你的字符串包含非换空间(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

我认为你在追踪和领先的白色空间之后。如果是这样,也许这一功能将工作:

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

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. 

我没有看到有关空格的任何异常,但电话号码中的破折号是U+2010 (HYPHEN),而不是ASCII连字符(U+002D)。