这个空白在哪里隐藏?
我有一个字符向量,这是一些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
输出之间的空单,但无论是在字符串中是不是一个标准的空间。我的目标是消除这个,所以我可以正确地把这个元素搞清楚。
升级我一个答案评论:
你的字符串包含非换空间(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)
我很困惑。 test [2]无论如何都不匹配,它没有数字来匹配[0-9]部分。 – 2012-07-28 21:22:42
你当然是对的。应该在盲目运行之前阅读正则表达式。一旦我得到有问题的数字,完美的工作,谢谢! – 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))
也可以在看出来的短破折号( - )和破折号( - )
我不确定是否正确理解问题。 – 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
)。
空白不在矢量本身中,它只是以它的显示方式。 – 2012-07-28 17:07:43
看看'lapply(test [4],utf8ToInt)',看看里面是否有大数字。 – 2012-07-28 17:37:39
@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