You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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;而手动输入的字符串用的是普通空格,所以匹配成功。

  • 隐藏不可见字符:网页文本可能夹杂零宽空格、控制字符等不可见内容,这些字符夹在数字、月份、年份之间,破坏了正则的匹配逻辑,但控制台打印时无法察觉,看起来和手动输入的字符串一致。

验证与解决方法

  1. 检查特殊字符:用charToRaw()对比抓取字符串和手动输入字符串的原始字节,就能定位差异:

    # 查看抓取字符串的原始字节
    charToRaw(country_comparison$status[1])
    # 查看手动输入字符串的原始字节
    charToRaw("Settled or terminated (withdrawn, mutually agreed solution) on 29 March 1995")
    
  2. 修改正则兼容空白字符:把正则里的普通空格换成\\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:22:43