Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >R语言与正则表达式

R语言与正则表达式

作者头像
用户1359560
发布于 2019-05-24 00:51:49
发布于 2019-05-24 00:51:49
2.5K00
代码可运行
举报
文章被收录于专栏:生信小驿站生信小驿站
运行总次数:0
代码可运行

R语言在提取字符串上有着强大的能力,其中字符串可以看做为文本信息。今天需要跟大家介绍一款更为通用、更加底层的文本信息提取工具——正则表达式。

所谓正则表达式,即使用一个字符串来描述、匹配一系列某个语法规则的字符串。通过特定的字母、数字以及特殊符号的灵活组合即可完成对任意字符串的匹配,从而达到提取相应文本信息的目的。在R语言中,有两种风格的正则表达式可以实现,一种就是在基本的正则表达式基础上进行扩展,这和相应的R字符串处理函数相关,另一种就是Perl正则表达式,这种风格的正则我们在R中一般不常用,本文主要还是针对R默认的基础的正则表达式风格进行讲解。 正则表达式是对字符串类型数据进行匹配判断,提取等操作的一套逻辑公式。

处理字符串类型数据方面,高效的工具有Perl和Python。如果我们只是偶尔接触文本处理任务,则学习Perl无疑成本太高;如果常用Python,则可以利用成熟的正则表达式模块:re库;如果常用R,则使用Hadley大神开发的stringr包则已经能够游刃有余。

下面,我们先简要介绍重要并通用的正则表达式规则。接着,总结一下stringr包中重要的字符处理函数。

元字符

正则表达式中,有12个字符被保留用作特殊用途。他们分别是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ ] \ ^ $ . | ? * + ( )

它们的作用如下:

  • [ ]:括号内的任意字符将被匹配;
  • \:具有两个作用:
    • 1.对元字符进行转义
    • 2.一些以\开头的特殊序列表达了一些字符串组
  • ^:匹配字符串的开始.将^置于character class的首位表达的意思是取反义。如[^5]表示匹配除了”5”以外的任何字符。
  • $:匹配字符串的结束。但将它置于character class内则消除了它的特殊含义。如[akm$]将匹配’a’,’k’,’m’或者’$’.
  • .:匹配除换行符以外的任意字符。
  • |:或者
  • ?:前面的字符(组)最多被匹配一次
  • *:前面的字符(组)将被匹配零次或多次
  • +:前面的字符(组)将被匹配一次或多次
  • ( ):表示一个字符组,括号内的字符串将作为一个整体被匹配。

重复

代码

含义说明

?

重复零次或一次

*

重复零次或多次

+

重复一次或多次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n次到m次

转义

如果我们想查找元字符本身,如”?”和”*“,我们需要提前告诉编译系统,取消这些字符的特殊含义。这个时候,就需要用到转义字符\,即使用\?\*.当然,如果我们要找的是\,则使用\\进行匹配。

注:R中的转义字符则是双斜杠:\\

R中预定义的字符组

代码

含义说明

[:digit:]

数字:0-9

[:lower:]

小写字母:a-z

[:upper:]

大写字母:A-Z

[:alpha:]

字母:a-z及A-Z

[:alnum:]

所有字母及数字

[:punct:]

标点符号,如. , ;等

[:graph:]

Graphical characters,即[:alnum:]和[:punct:]

[:blank:]

空字符,即:Space和Tab

[:space:]

Space,Tab,newline,及其他space characters

[:print:]

可打印的字符,即:[:alnum:],[:punct:]和[:space:]

代表字符组的特殊符号

代码

含义说明

\w

字符串,等价于[:alnum:]

\W

非字符串,等价于[^[:alnum:]]

\s

空格字符,等价于[:blank:]

\S

非空格字符,等价于[^[:blank:]]

\d

数字,等价于[:digit:]

\D

非数字,等价于[^[:digit:]]

\b

Word edge(单词开头或结束的位置)

\B

No Word edge(非单词开头或结束的位置)

\<

Word beginning(单词开头的位置)

\>

Word end(单词结束的位置)


stringr包中的重要函数

函数

功能说明

R Base中对应函数

使用正则表达式的函数

str_extract()

提取首个匹配模式的字符

regmatches()

str_extract_all()

提取所有匹配模式的字符

regmatches()

str_locate()

返回首个匹配模式的字符的位置

regexpr()

str_locate_all()

返回所有匹配模式的字符的位置

gregexpr()

str_replace()

替换首个匹配模式

sub()

str_replace_all()

替换所有匹配模式

gsub()

str_split()

按照模式分割字符串

strsplit()

str_split_fixed()

按照模式将字符串分割成指定个数

-

str_detect()

检测字符是否存在某些指定模式

grepl()

str_count()

返回指定模式出现的次数

-

其他重要函数

str_sub()

提取指定位置的字符

regmatches()

str_dup()

丢弃指定位置的字符

-

str_length()

返回字符的长度

nchar()

str_pad()

填补字符

-

str_trim()

丢弃填充,如去掉字符前后的空格

-

str_c()

连接字符

paste(),paste0()

可见,stringr包中的字符处理函数更丰富和完整(其实还有更多函数),并且更容易记忆。或许速度也会更快。


其他相关的重要函数

windows下处理字符串类型数据最头疼的无疑是编码问题了。这里介绍几个编码转换相关的函数。

函数

功能说明

iconv()

转换编码格式

Encoding()

查看编码格式;或者指定编码格式

tau::is.locale()

tests if the components of a vector of character are in the encoding of the current locale

tau::is.ascii()

tau::is.utf8()

tests if the components of a vector of character are true UTF-8 strings

R默认的正则表达式风格包括基础文本处理函数和stringr包中的文本处理函数。在R中二者都支持正则表达式,也都具备基本的文本处理能力,但基础函数的一致性要弱很多,在函数命名和参数定义上很难让人印象深刻。stringr包是Hadley Wickham开发了一款专门进行文本处理的R包,它对基础的文本处理函数进行了扩展和整合,在一致性和易于理解性上都要优于基础函数。本文在介绍基本的正则表达式语法的基础上,通过R中这两种文本处理函数进行实例说明,也好让大家对R语言中正则表达式的基本用法有个大致了解,在后续的爬虫演练中更容易理解一些信息提取的细节知识。

基本的正则表达式语法

实际应用中正则表达式的一个比较经典的使用场景是识别电子邮箱地址。一个正常的电子邮箱账户应该由下面几部分构成:任意字符、数字和符号组成的用户名+@+.+com/net等域名。根据正则表达式的语法规则,我们就可以由这几部分写出邮箱账户的正则表达式:

[A-Za-z0-9._+]+@[A-Za-z0-9]+.(com|org|edu|net)

其中:

[A-Za-z0-9._+]+:A-Z表示匹配任意的A-Z大写字母,所有可能的组合放在中括号里表示可以匹配其中的任一个,加号表示任意字符可以出现1次或者多次,\表示转义,因为.在正则表达式中有特殊含义,想要正常的表达.号必须使用转义符。

@:邮箱必须的一个符号。

[A-Za-z0-9]:同前面一样,@符号后面必须有一个包含运营商信息的字符串。

.:邮箱地址中必须要有的一个点号。

(com|org|edu|net):列出邮箱地址可能的域名系统,括号内表示分组处理,|符号表示或的含义。

image.jpeg

另外也有一些在线测试正则表达式的网页,大家可以拿来练手,小编这里也推荐一个:

https://www.regexpal.com/

image.jpeg

R中基础文本处理函数和stringr包文本处理函数对于正则表达式的支持情况如下表所示:

image.png

基础文本处理函数中正则表达式的应用

R中常用的支持正则表达式的基础文本处理函数包括grep/grepl、sub/gsub、regexpr/gregexpr等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
example_text1 <- c("23333#RRR#PP","35555#CCCC","louwill#2017")
  • 以#进行字符串切分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unlist(strsplit(example_text1, "#"))

[1] "23333"   "RRR"     "PP"      "35555"   "CCCC"    "louwill" "2017"
  • 以空字符集进行字符串切分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unlist(strsplit(example_text1, "\\s"))

[1] "23333#RRR#PP" "35555#CCCC"   "louwill#2017"
  • 以空字符替换字符串第一个#匹配
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sub("#","", example_text1)

[1] "23333RRR#PP" "35555CCCC"   "louwill2017"
  • 以空字符集替换字符串全部#匹配
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gsub("#","",example_text1)

[1] "23333RRRPP"  "35555CCCC"   "louwill2017"
  • 查询字符串中是否存在3333或5555的特征并返回所在位置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
grep("[35]{4}", example_text1)

[1] 1 2
  • 查询字符串中是否存在3333或5555的特征并返回逻辑值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
grepl("[35]{4}", example_text1)

[1]  TRUE  TRUE FALSE
  • 返回匹配特征的字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pattern <- "[[:alpha:]]*(,|#)[[:alpha:]]"

m <- regexpr(pattern, example_text1)

regmatches(example_text1, m)

[1] "#R" "#C"

stringr包文本处理函数中的正则表达式的应用

stringr包一共为我们提供了30个字符串处理函数,其中大部分均可支持正则表达式的应用,包内所有函数均以str_开头,后面单词用来说明该函数的含义,相较于基础文本处理函数,stringr包函数更容易直观地理解。本文仅以str_extract和str_extract_all函数为例,对stringr包的正则表达式应用进行简要说明。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
example_text2 <- "1\. A small sentence. - 2\. Another tiny sentence."

library(stringr)
  • 提取small特征字符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str_extract(example_text2, "small")

[1] "small"
  • 提取包含sentence特征的全部字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unlist(str_extract_all(example_text2, "sentence"))

[1] "sentence" "sentence"
  • 提取以1开始的字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str_extract(example_text2, "^1")

[1] "1"
  • 提取以句号结尾的字符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unlist(str_extract_all(example_text2, ".$"))

[1] "."
  • 提取包含tiny或者sentence特征的字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unlist(str_extract_all(example_text2, "tiny|sentence"))

[1] "sentence" "tiny"     "sentence"
  • 点号进行模糊匹配
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str_extract(example_text2, "sm.ll")

[1] "small"
  • 中括号内表示可选字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str_extract(example_text2, "sm[abc]ll")

[1] "small"

str_extract(example_text2, "sm[a-p]ll")

[1] "small"

对于特定的字符我们可以手动指定,比如[a-z A-Z]表示a-z和A-Z之间的所有字母,但R预先定义了一些字符集方便大家调用,如下表所示。

image.png

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str_extract(example_text2, "([[:alpha:]]).+?\\1")

[1] "A small sentence. - 2\. A"

除此之外,R中正则表达式的应用还有若干简化的形式,它被分配给几个特定的字符类,如下表所示:

image.jpeg

  • 提取全部单词字符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unlist(str_extract_all(example_text2, "\\w+"))

[1] "1"        "A"        "small"    "sentence" "2"        "Another"  "tiny"    

[8] "sentence"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
左手用R右手Python系列13——字符串处理与正则表达式
学习数据分析,掌握一些灵巧的分析工具可以使得数据清洗效率事半功倍,比如在处理非结构化的文本数据时,如果能够了解一下简单的正则表达式,那么你可以免去大量的冗余代码,效率那叫一个高。 正则表达式是一套微型的袖珍语言,非常强大,依靠一些特定的字母和符号作为匹配模式,灵活组合,可以匹配出任何我们需要的的文本信息。 而且它不依赖任何软件平台,没有属于自己的GUI,就像是流动的水一样,可以支持绝大多数主流编程语言。 今天这一篇只给大家简单介绍正则表达式基础,涉及到一些常用的字符及符合含义,以及其在R语言和Python
数据小磨坊
2018/04/11
1.7K0
左手用R右手Python系列13——字符串处理与正则表达式
文本挖掘|你好,正则表达式!
文本信息: “Ta说群众笑脸smile是最好的扶贫成绩单1234”,按照以往的思路是知道英文字符在文本中的起始位置与终止位置,再根据位置提取出来。当数据量小的时候,这种思路操作是没什么毛病的,但是,当数据量大时,显然这种方法又土又麻烦。
黑妹的小屋
2020/08/05
7230
文本挖掘|你好,正则表达式!
R语言︱文本(字符串)处理与正则表达式
处理文本是每一种计算机语言都应该具备的功能,但不是每一种语言都侧重于处理文本。R语言是统计的语言,处理文本不是它的强项,perl语言这方面的功能比R不知要强多少倍。幸运的是R语言的可扩展能力很强,DNA/RNA/AA等生物序列现在已经可以使用R来处理。
悟乙己
2019/05/26
4.3K0
R语言:通过jiebaR提升正则匹配效率
大家会不会经常遇到这样的情况,需要在一系列的目标文本中,匹配搜索一系列特征文本,且这些特征文本可能在该某一目标文本中重复出现。例如如下数据集:
用户7652506
2022/01/07
4530
【Python之正则表达式与JSON】
在当今快速发展的技术领域,Python已经成为了许多开发者首选的编程语言之一。其简洁而强大的语法使其在各种领域都有着广泛的应用。本篇博客将引领你深入了解Python中正则表达式与JSON的强大组合,揭示它们如何协同工作,为开发者提供了解析和处理文本数据的高效方式。
老虎也淘气
2024/01/30
3510
C++正则表达式攻略:从基础到高级应用
正则表达式是一种用于匹配、搜索和编辑文本的字符串模式。它由一系列字符和特殊符号构成,可以灵活地表达文本的模式、结构和特征。正则表达式在各种编程语言和应用程序中广泛应用,包括C++。它可以用来在文本中查找特定模式的字符串、验证输入的格式、提取信息和进行文本替换等操作。
Lion Long
2025/01/19
1740
C++正则表达式攻略:从基础到高级应用
正则表达式的详解带你认识正则表达式的意义
​ 我们都知道协议通常通过添加固定的字符、报头、特定的数字等来定义数据的结构和格式。将正确的信息提取出来是十分重要的,而正则表达式可以用来描述和匹配这些固定的结构,从而提取出所需的信息。并且正则表达式还可以处理大量复杂的字符串。这篇文章将会带你彻底了解正则表达式。
薄荷冰
2024/06/09
6570
数据科学系列:数据处理(7)--字符串函数基于R(三)
这一部分,将R语言stringr包中的使用正则表达式的字符串函数简单介绍一下,会用到正则表达式的相关内容,有关正则表达式的知识可以回顾R&Python Data Science系列:数据处理(6)--字符串函数基于R(二)
1480
2019/11/21
9430
深入理解Python正则表达式:解析、匹配和高级技巧
正则表达式是一种强大的文本处理工具,它允许你在文本中搜索、匹配和处理模式。Python中的re模块提供了对正则表达式的支持,本文将深入探讨Python正则表达式的工作原理、基本用法、高级技巧以及实际应用,帮助你更好地掌握这一强大的工具。
海拥
2023/09/19
2.5K0
深入理解Python正则表达式:解析、匹配和高级技巧
正则表达式:理解与运用
正则表达式,也称为正则表达式或简称正则,是一种强大的文本处理工具。它可以在文本中查找、替换和提取符合特定模式的文本。本文将解释正则表达式的概念、用法和常见参数。
为了伟大的房产事业
2024/03/15
4080
Python 正则表达式优化与解析
在互联网时代,信息爆炸的背景下,如何快速高效地处理和解析大量的文本数据成为了互联网专家必备的技能之一。Python 作为一门强大的编程语言,提供了丰富的正则表达式(Regular Expression)功能,可以帮助我们在文本处理方面事半功倍。本文将介绍如何在 Python 中进行正则表达式优化和解析,以提升互联网专家的效率。
疯狂的KK
2023/08/06
2930
Python 正则表达式优化与解析
正则表达式(一)
该文介绍了如何利用正则表达式进行字符串处理的一些基本应用。包括字符串匹配、分割、替换等。还介绍了String类中自带的一些正则表达式方法,如matches、split、replace等。
codingblock
2017/12/29
5670
正则表达式:(mysql)
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000’
后端码匠
2019/09/02
1.2K0
正则表达式:(mysql)
精通正则表达式 - 正则表达式实用技巧
        希望匹配连续多行文本,常见的情况是,一个逻辑行(logical line)可以分为许多现实的行,每一行以反斜杠结尾。
用户1148526
2023/10/14
9490
Python从0到100(二十四):正则表达式的应用
正则表达式是一种用于字符串搜索和操作的强大工具,它允许你使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在编程中,正则表达式被广泛应用于文本处理,如模式搜索、文本替换、字符串验证等。
是Dream呀
2024/05/28
1010
从基础到最佳实践:精通Python正则表达式
Python re模块精通:解锁Regex文本处理能力!从数据提取、用户验证到自动化任务,掌握字符类、量词、锚点等核心概念。更有re.search()、re.sub()等函数,结合IGNORECASE等修饰符,提升数据处理效率,玩转Cloud Native!
云云众生s
2025/03/20
1160
【Python】正则表达式的艺术:轻松驾驭 Python 的re库
本文将会先介绍什么是正则表达式,然后在介绍正则表达式在python中的应用。 下方图片及案例思路来自:正则表达式
Yui_
2024/12/20
1530
【Python】正则表达式的艺术:轻松驾驭 Python 的re库
Linux通配符和正则表达式通配符 区别_linux正则表达式语法
通配符是shell在做PathnameExpansion时用到的。说白了一般只用于文件名匹配,它是由shell解析的,比如find,ls,cp,mv等。
全栈程序员站长
2022/10/02
5.1K0
Linux通配符和正则表达式通配符 区别_linux正则表达式语法
正则表达式
https://blog.csdn.net/CSDN___LYY/article/details/53104136
洋仔聊编程
2019/01/15
8610
Shell 正则表达式
正则表达式是用于描述字符排列和匹配模式的一种语法规则。 它主要用于字符串的模式分割、匹配、查找以及替换操作。
小小工匠
2021/08/16
1.1K0
相关推荐
左手用R右手Python系列13——字符串处理与正则表达式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验