为何stringr::str_extract对某字符向量始终返回NA?
问题:从WTO抓取数据用str_extract提取日期返回NA的原因?
尝试用str_extract从世界贸易组织(WTO)网站抓取的数据中提取日期时,目标字符向量始终返回NA,但手动输入相同字符串却能正常提取。具体代码及运行结果如下:
> country_comparison$status[1:10] [1] "Settled or terminated (withdrawn, mutually agreed solution) on 29 March 1995" "Implementation notified by respondent on 25 September 1997" [3] "In consultations on 4 April 1995" "Implementation notified by respondent on 25 September 1997" [5] "Settled or terminated (withdrawn, mutually agreed solution) on 20 July 1995" "Settled or terminated (withdrawn, mutually agreed solution) on 19 July 1995" [7] "Settled or terminated (withdrawn, mutually agreed solution) on 5 July 1996" "Mutually acceptable solution on implementation notified on 9 January 1998" [9] "Panel established, but not yet composed on 11 October 1995" "Mutually acceptable solution on implementation notified on 9 January 1998" > country_comparison$status[1:10] %>% str_extract(pattern = "[0-9]{1,2} [A-Za-z]+ [0-9]{4}") [1] NA NA NA NA NA NA NA NA NA NA > c("Settled or terminated (withdrawn, mutually agreed solution) on 29 March 1995", "Implementation notified by respondent on 25 September 1997") %>% str_extract(pattern = "[0-9]{1,2} [A-Za-z]+ [0-9]{4}") [1] "29 March 1995" "25 September 1997"
核心原因分析
非标准空格字符:网页抓取的文本中,日期前后的空格大概率不是普通半角空格(
,ASCII码32),而是网页常用的不间断空格( ,ASCII码160)或全角空格。你的正则表达式用的是普通空格,无法匹配这些特殊空格,导致返回NA;而手动输入的字符串用的是普通空格,所以匹配成功。隐藏不可见字符:网页文本可能夹杂零宽空格、控制字符等不可见内容,这些字符夹在数字、月份、年份之间,破坏了正则的匹配逻辑,但控制台打印时无法察觉,看起来和手动输入的字符串一致。
验证与解决方法
检查特殊字符:用
charToRaw()对比抓取字符串和手动输入字符串的原始字节,就能定位差异:# 查看抓取字符串的原始字节 charToRaw(country_comparison$status[1]) # 查看手动输入字符串的原始字节 charToRaw("Settled or terminated (withdrawn, mutually agreed solution) on 29 March 1995")修改正则兼容空白字符:把正则里的普通空格换成
\\s(匹配所有空白字符,包括特殊空格、制表符等):country_comparison$status[1:10] %>% str_extract(pattern = "[0-9]{1,2}\\s[A-Za-z]+\\s[0-9]{4}")或者直接指定匹配普通空格和不间断空格:
country_comparison$status[1:10] %>% str_extract(pattern = "[0-9]{1,2}[ \\xA0][A-Za-z]+[ \\xA0][0-9]{4}")
内容的提问来源于stack exchange,提问作者saladmobster
相关产品推荐
相关产品推荐

