名字正则只能是中文英文_【R语言新书】1.5 正则表达式

2a5f222996a6947dbc5f5a7571b366c4.png
张敬信:我的R语言新书信息汇总​zhuanlan.zhihu.com
39ccb0fada7eb1062b2ac96310357ce3.png

很多正则表达式的书或文章都列了很多语法,但配的都是空洞的示例,让人看完却不知道怎么使用它们。希望本节内容,能让你真正入门和上手正则表达式。

——————————

1.5 正则表达式

正则表达式,是根据字符串规律按一定法则,简洁表达一组字符串的表达式。正则表达式通常就是从貌似无规律的字符串中发现规律性,进而概括性地表达它们所共有的规律或模式,以方便地操作处理它们,这是真正的化繁为简,以简御繁的典范。

几乎所有的高级编程语言都支持正则表达式,正则表达式广泛应用于文本挖掘、数据预处理,例如:

  • 检查文本中是否含有指定的特征词
  • 找出文本中匹配特征词的位置
  • 从文本中提取信息
  • 修改文本

正则表达式包括:只能匹配自身的普通字符(如英文字母、数字、标点等)和被转义了的特殊字符(称为‘‘元字符’’)。

1.5.1 基本语法

1. 常用的元字符

c74bb26ef78dd6429be42ae9f0faf638.png

56827d443e4c5b80a52758ffbbb3efb9.png

2. 特殊字符类与反义

1330f66cc14be5e60bbcaf2f46e6f91a.png

4c2faf70e4546b2b641fea7f14163e35.png

3. POSIX 字符类

1fc61df6d4e5fbcf0473cefe2c28ef13.png

4. 运算优先级

圆括号括起来的表达式最优先,其次是表示重复次数的操作(即* + { });再次是连接运算(即几个字符放在一起,如abc);最后是或者运算(|)。

另外,正则表达式还有若干高级用法,常用的有零宽断言和分组捕获,将在下面实例中进行演示。

1.5.2 若干实例

以上正则表达式语法组合起来使用,就能产生非常强大的匹配效果,对于匹配到的内容,根据需要可以提取它们,可以替换它们。

532c5a98182f850c88d89199d692e71a.png

使用正则表达式关键是,能够从貌似没有规律的字符串中发现规律性,再将规律性用正则表达式语法表示出来。下面看几个正则表达式比较实用的实例。

例1.2 直接匹配

适合想要匹配的内容具有一定规律性,该规律性可用正则表达式表示出来。比如,数据中包含字母、符号、数值,我们想提取其中的数值,按正则表达式语法规则直接把要提取的部分表示出来:

x = c("CDK 弱(+)10%+", "CDK(+)30%-", "CDK(-)0+", "CDK(++)60%*")
str_view(x, "d+%")

516f9c096999dc8fd0b7bbcf42632032.png
str_view(x, "d+%?")

53284514f4058f638b23e02ab1a51164.png

f6cf89a68a98010c59186f16c4aed043.png

例1.3 (零宽断言)匹配两个标志之间的内容

适合想要匹配的内容没有规律性,但该内容位于两个有规律性的标志之间,标志也可以是开始和结束。

通常想要匹配的内容不包含两边的 "标志",这就需要用零宽断言。简单来说,就是一种引导语法告诉既要匹配到 "标志",但又不包含 "标志"。左边标志的引导语法是 (?<= 标志),右边标志的引导语法是 (?= 标志),而真正要匹配的内容放在它们中间。

比如,来自问卷星 "来自IP” 数据,想要提取IP、省份。

x = c("175.10.237.40(湖南-长沙)", "114.243.12.168(北京-北京)",
      "125.211.78.251(黑龙江-哈尔滨)")
# 提取省份
str_extract(x, "(.*-")              # 对比,不用零宽断言

2c4aa09ba7ef022afb4d1f440fc9eab9.png
str_extract(x, "(?<=().*(?=-)")     # 用零宽断言

fbeed3cc7624d9eb2ef6abd7d0c14212.png
# 提取IP
str_extract(x, "d.*d")            # 直接匹配
str_extract(x, "^.*(?=()")          # 用零宽断言

2c15e762d39f91a98880b46f669733b9.png

080d2d6f5f3d453fe9a3588c46a5c701.png

再比如,用零宽断言提取专业(位于 "级" 和数字之间):

x = c("18 级能源动力工程2 班", "19 级统计学1 班")
str_extract(x, "(?<= 级).*?(?=[0-9])")

8afed624053502f29396fdfaaef81f78.png

2e0007235a6cb4210c46d5d664ebb256.png

例1.4 分组捕获

正则表达式中可以用圆括号来分组,作用是

  • 确定优先规则
  • 组成一个整体
  • 拆分出整个匹配中的部分内容(称为捕获)
  • 捕获内容供后续引用或者替换。

比如,来自瓜子二手车的数据:若型号是中文,则品牌与型号中间有空格;若型号为英文或数字,则品牌与型号中间没有空格。

若用正则表达式匹配 "字母或数字” 并分组,然后捕获该分组并用添加空格替换:

x = c(" 宝马X3 2016 款", " 大众速腾2017 款", " 宝马3 系2012 款")
str_replace(x, "([a-zA-Z0-9])", " 1")

585f93c346e09e745501df9b305fc6c2.png

后续再用空格分割列即可。更多分组的引用还有 2, 3, . . .

dfa8033360dba507eb0f6fce7295e07e.png

本节部分内容参阅 "正则表达式30 分钟入门教程"、(Hadley Wickham 2017)、(李

东风2020).

参考文献:

deerchao,正则表达式30 分钟入门教程,博客园

Hadley Wickham,R for Data Science,2017.

李东风,R语言教程,2020.

——————————

版权声明:原创作品,版权所有,禁止用于一切出版。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值