R语言中的正则表达式最全解析

正则表达式即使用一个字符串来描述、匹配一系列某个语法规则的字符串。通过特定的字母、数字及特殊符号的灵活组合即可完成对任意字符串的匹配,从而达到提取相应文本信息的目的。R语言中有两种风格的正则表达式可实现,一种是在基本正则表达式基础上进行扩展,这和相应的R字符串处理函数相关,另一种就是Perl正则表达式,这种风格的正则在R中一般不常用。R默认的正则表达式风格包括基础文本处理函数和stringr包中的文本处理函数。在R中二者都支持正则表达式也都具备基本的文本处理能力,但基础函数的一致性要弱很多,在函数命名和参数定义上很难让人印象深刻。stringr包是Hadley Wickham开发了一款专门进行文本处理的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次或者多次,\表示转义
grepl('[A-Za-z0-9\\._+]','\\')		#TRUE
@:邮箱必须的一个符号
[A-Za-z0-9]:同前面一样,@符号后面必须有一个包含运营商信息的字符串
\.:邮箱地址中必须要有的一个点号
(com|org|edu|net):列出邮箱地址可能的域名系统,括号内表示分组处理,|符号表示或

二.正则表达式速查表

三.正则表达式圆括号

#圆括号是组,应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理
#圆括号里面的内容表示一个子表达式,()本身并不匹配任何东西
(\\s+)		#表示连续空白字符的字符串
(abc|bcd|cde)		#表示出现三者之一(顺序必须一致)
a(?=bbb)	#表示a后面必须紧跟3个连续的b

四.正则表达式中的\1、\2含义

#\1表示重复第一个括号里面的内容,\2表示重复第二个括号里面的内容
#\1、\2必须和()配合使用
x=c('abbbbccccaaba')
m <-regexpr("(a).*?\\1", x)	#?非贪婪匹配失效
regmatches(x, m)		#"abbbbccccaaba"

x=c('aaaaaaaaabbbbcccc')
m <-regexpr("(a)\\1+?", x)
m <-regexpr("(a)\\1+", x)	#与上式等价,用\1或\2时不能识别非贪婪匹配

x=c('aaaaaaaaabbbbcccc')
m <-regexpr("(\\w)\\1+", x)
regmatches(x, m)	#'aaaaaaaaa'

x=c('abbbbcccc')
m <-regexpr("(\\w)\\1+", x)
regmatches(x, m)	#'bbbb'

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

stringr包一共提供30个字符串处理函数,其中大部分均可支持正则表达式应用,包内所有以str_开头函数,后面单词用来说明该函数含义,相较于基础文本处理函数,stringr包函数更易理解

example_text2 <- "1. A small sentence. - 2. Another tiny sentence."
library(stringr)
#提取small特征字符
str_extract(example_text2, "small")
[1] "small"
#提取包含sentence特征的全部字符串
unlist(str_extract_all(example_text2, "sentence"))
[1] "sentence" "sentence"
#提取以1开始的字符串
str_extract(example_text2, "^1")
[1] "1"
#提取以句号结尾的字符
unlist(str_extract_all(example_text2, ".$"))
[1] "."
#提取包含tiny或者sentence特征的字符串
unlist(str_extract_all(example_text2, "tiny|sentence"))
[1] "sentence" "tiny" "sentence"
#点号进行模糊匹配
str_extract(example_text2, "sm.ll")
[1] "small"
#中括号内表示可选字符串
str_extract(example_text2, "sm[abc]ll")
[1] "small"
str_extract(example_text2, "sm[a-p]ll")
[1] "small"

对于特定字符可以手动指定,比如[a-zA-Z]表示a-z和A-Z之间的所有字母,但R预先定义了一些字符集

str_extract(example_text2, "([[:alpha:]]).+?\\1")
[1] "A small sentence. - 2. A"

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

#提取全部单词字符
unlist(str_extract_all(example_text2, "\\w+"))
[1] "1"        "A"        "small"    "sentence" "2"        "Another"  "tiny"    
[8] "sentence"

六.正则表达式的运算顺序

圆括号括起来的表达式最优先,然后是表示重复次数的操作(即:*+{}),接下来是连接运算(其实就是几个字符放在一起,如abc),最后是表示可选项的运算(|)。所以 'foot|bar'可以匹配'foot'或者'bar'

.\b单词边界

"\b"匹配单词边界,不匹配任何字符(只是一个位置),这个位置的一侧是构成单词的字符,另一侧是非单词字符、字符串开始或结束位置."\b"是零宽度的
--正则表达式中的单词指"\w"定义的字符所组成的子串
---------
"\w"范围:
在支持ASCII码的语言中,如JavaScript,"\w"等价于[a-zA-Z0-9_] 
在支持Unicode的语言中,如.NET,默认情况下,除可以匹配[a-zA-Z0-9_]外,还可以匹配一些Unicode字符集,如汉字,全角数字等
--------
"\b"在正则中,通常都是表示单词边界,但在字符组中,表示退格键,如[a-z\b]

 

  • 43
    点赞
  • 200
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言:本资源来自于javaeye,原资源链接地址:http://www.javaeye.com/topic/67398 原文如下: 以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类用到了 jakarta-oro-2.0.jar ,请大家自己在 apache网站下下载 在这是junit测试单元类我就不提交了,在main()方法有几个小测试,有兴趣自己玩吧. 这个工具类目前主要有25种正规表达式(有些不常用,但那时才仔细深入的研究了一下正规,写上瘾了,就当时能想到的都写了): 1.匹配图象; 2 匹配email地址; 3 匹配匹配并提取url ; 4 匹配并提取http ; 5.匹配日期 6 匹配电话; 7 匹配身份证 8 匹配邮编代码 9. 不括特殊字符的匹配 (字符串括符号 数学次方号^ 单引号' 双引号" 分号; 逗号, 帽号: 数学减号- 右尖括号> 左尖括号 0) 12 匹配正整数 13 匹配非正整数(负整数 + 0) 14 匹配负整数; 15. 匹配整数 ; 16 匹配非负浮点数(正浮点数 + 0) 17. 匹配正浮点数 18 匹配非正浮点数(负浮点数 + 0) 19 匹配负浮点数; 20 .匹配浮点数; 21. 匹配由26个英文字母组成的字符串; 22. 匹配由26个英文字母的大写组成的字符串 23 匹配由26个英文字母的小写组成的字符串 24 匹配由数字和26个英文字母组成的字符串; 25 匹配由数字、26个英文字母或者下划线组成的字符串; java源码: /* * Created on 2005-4-15 * * Summary of regular-expression constructs 正则表达式结构简介: * Construct Matches * Characters 字符: * x The character x x 字符 x * \\ The backslash character \\ 反斜杠 * \0n The character with octal value 0n (0 <= n <= 7) \0n 十进制数 (0 <= n <= 7) * \0nn The character with octal value 0nn (0 <= n <= 7) \0nn 十进制数 0nn (0 <= n <= 7) * \0mnn The character with octal value 0mnn (0 <= m <= 3, 0 <= n <= 7) \0mnn 十进制数 0mnn (0 <= m <= 3, 0 <= n <= 7) * \xhh The character with hexadecimal value 0xhh \xhh 十六进制数 0x
### 回答1: 正则表达式可以用来匹配手机号码。 在国,手机号码由11位数字组成,一般以13、14、15、17、18、19开头。因此,可以使用如下的正则表达式来匹配手机号码: ^1[3456789]\d{9}$ 这个正则表达式的含义是: ^:匹配开头 1:匹配第一个数字为1 [3456789]:匹配第二个数字为3、4、5、6、7、8、9的任意一个 \d:匹配一个数字 {9}:匹配9个数字 $:匹配结尾 例如,可以使用这个正则表达式来匹配手机号码13800138000和18888888888,但是不能匹配手机号码138001380000和188888888。 注意:这个正则表达式只能匹配国的手机号码,对于其他国家的手机号码可能不适用。 ### 回答2: 正则表达式是用于匹配文本特定模式的工具。在匹配手机号的场景,可以使用正则表达式来验证一个字符串是否符合手机号的格式要求。 下面是一个匹配手机号的正则表达式示例: ^\d{11}$ 解析: - ^ 表示匹配字符串的开始位置 - \d 表示匹配数字 - {11} 表示前面的\d必须连续出现11次 - $ 表示匹配字符串的结束位置 以上的正则表达式可以用来判断一个字符串是否为11位数字,如果是,则符合手机号的格式要求。 使用这个正则表达式可以在编程语言进行验证,例如在Python使用re模块: ```python import re def is_valid_phone_number(phone_number): pattern = r'^\d{11}$' return re.match(pattern, phone_number) is not None ``` 上述代码,is_valid_phone_number函数接受一个phone_number参数,然后使用re.match函数和正则表达式来验证手机号的格式是否正确。如果返回值不为None,则表示匹配成功,也就是手机号格式正确。 需要注意的是,以上的正则表达式只验证了手机号的格式是否正确,并不能保证这个手机号确实存在。如果需要进一步验证手机号的有效性,可以使用短信验证或者拨打电话等方式进行确认。 ### 回答3: 正则表达式是一种强大的文本模式匹配工具,在匹配手机号码时,可以使用以下正则表达式: ^1[3456789]\d{9}$ 这个正则表达式的含义是:以数字1开头,紧接着是3456789的一个数字,然后是任意的9位数字,整个字符串的长度是11位。 具体解释如下: - ^ 表示匹配字符串的开始位置。 - 1 表示要匹配的手机号码的开头必须是数字1。 - [3456789] 表示接下来的字符可以是3456789的任意一个。 - \d 表示任意的数字。 - {9} 表示前面的\d必须恰好重复9次,也就是说必须是9位数字。 - $ 表示匹配字符串的结束位置。 例如,如果我们要匹配手机号码13612345678,这个正则表达式就能够准确匹配。 当我们使用正则表达式进行匹配时,可以使用编程语言提供的正则表达式匹配函数,传入待匹配的字符串和正则表达式作为参数,函数会返回匹配的结果。 需要注意的是,手机号码有可能会有变化,如增加或者修改数字的范围,所以在实际使用时,要根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值