Web内容主要为无结构文本,网络抓取的关键在于从文本数据中提取与研究相关的信息。此过程通常包括三个步骤:收集无结构文本、识别信息背后的规律以及应用规律提取信息。以HTML网页为例,理论上可以通过XPath提取关键数据,但某些关键信息可能隐藏在网页深层或分布于各部分,使网页结构分析方法失效。此时,正则表达式成为分析文本中规律的强大工具。正则表达式是一种描述字符串集合的模式,分为扩展基本正则表达式和Perl正则表达式两种类型。R语言中主要使用的是扩展基本正则表达式。正则表达式主要用于匹配和提取文本中的特定模式。在R中,主要通过`stringr`包中的`str_extract`和`str_extract_all`函数实现。`str_extract`函数用于在一个字符串中查找第一个与正则表达式匹配的实例,而`str_extract_all`则可以对多个字符串进行操作,返回所有匹配结果。例如,对于一个包含多个字符串的向量,使用`str_extract_all`函数可以提取所有匹配的结果。函数的输出通常是一个列表,每个列表元素对应一个字符串的结果。如果结果列表长度为1(即输入字符串长度为1),可以通过`unlist`函数解析。此外,还可以通过设置参数`simplify`为`TRUE`,将结果转换为矩阵形式。正则表达式不仅用于匹配单词,还可以匹配任意字符序列。特定符号如`^`和`$`用于标记字符串的开始和结束,而`|`表示“或”操作,使正则表达式能够匹配多个可能的模式。在字符序列中,可以通过特定符号如`-`在字符范围内匹配特定字符,如`a-g`表示匹配从a到g的任意字符。此外,正则表达式可以包含数字、标点符号和空格,R中预定义了一些常用的字符类,如`\w`匹配单词字符,`\b`匹配单词边界。通过在字符类前加入`^`,可以反转字符类的匹配规则,使其匹配除该字符类包含字符之外的所有字符。在字符类中使用 `{n}` 表示重复特定字符 n 次,如 `a{4}` 表示匹配连续4个字符a。加号(+)表示匹配前面条目至少一次,如 `A.+sentence` 可以提取以A开头,以sentence结尾的序列。R语言默认采用贪婪量化模式,即尽可能匹配最大合法序列。如果希望匹配最短序列,可以通过添加`?`来表示可选匹配,最多匹配一次。元字符如`.; |; (); []; {}; ^; $; *; +; ?; -`在正则表达式中具有特殊含义。为了在字符串中匹配这些元字符,可以使用双斜杠或`fixed()`函数进行转义。正则表达式的应用包括反向引用(backreferencing),即在匹配模式中引用之前匹配的子字符串。例如,`[[:alpha:]]+.+?\1`表示在匹配出的字符下一次出现时进行引用。实例:提取电话目录中的人名和号码。人名模式中包含字母、句点、逗号和空格,可使用`[[:alpha:.], ]`表示。号码提取需要分析号码的组成,包括区号、括号、破折号和数字等。通过这些方法,正则表达式为从复杂文本数据中提取信息提供了强大而灵活的工具。