你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

正则表达式能干嘛?

[复制链接]
gaosmile 发布时间:2021-2-5 13:44
正则表达式(Regular Expression,或者Regex),能干嘛?听说很强悍,很多人用来查找字符串,或者替换某些字符串。
4 B$ f. b# P: v2 ~" y1 Y) m% f) s
实际上,正则表达式有四个功能:
  • 匹配,即查找,例如,从杂乱的一堆文本里面,找到你想要的
  • 替换,按某种规则替换内容
  • 分割,将文本内容按某种规则分割开来
  • 检验,检验某文本是否符合规则
    9 e* ]% S9 E) v, T, A6 z
如果没玩过正则表达式,也看不出这四个功能到底能干嘛。
我刚学那阵,觉得这东西,玩点小儿科的东西还行,能干大事?
后来,越用越多,发现这货在你遇到困境的时候可以力挽千钧。
话说回来,这个东西能装逼吗?
1. 你女朋友喊你查她的号码
你女朋友(假如你有)有一天跟你撒娇,她给你一个txt文档,里面存着一个她的号码,让你把她的号码找出来。此时,你不记得她的完整号码了,如果找不出来,晚上就得跪CPU了。刹那间,你想到了,她的号码有这样的数字……771……55(亲亲你……嗯嗯)。于是你,快速用Notepad++打开含有一堆乱七八糟电话号码的文本。查找输入:1\d+771\d+55,然后回车,Bingo!不信,你试试:
15672846712
0 ^2 i2 a. g2 D 13892738409           021-82937465
8 ]- q% j6 ^$ T' C0 P- m' Z 13263748592   18028374732 : u  o  [* z7 p( |, B5 I
010-27384762
: d" T8 |, X/ d8 G5 U 13877190955 022-2873625
2 p" a# R0 T  [7 D! W6 S 1324353738
+ V0 n& O' \6 H. k- r$ i* y* `4 T 1621723839 38293923 48234934
9 j9 _6 a. t( |. p 3123372390 1367282902 1356282920) l+ l) `+ l3 C3 c) Z
......
微信图片_20210205134224.png
好吧,故事是虚构的,也别幻想你女朋友真的让你查号码了。
简单解释一下,这里面的\d就是表示digital的意思即0-9都可以用\d来描述,而\d+就表示有多个数字。这个是正则表达式中非常简单的应用了。
2. 查找文件中某字符串内容
模糊搜索到底怎么搞的,你有想过么?要不先来玩下这个,好像有种“万军之中取人头颅如探囊取物”感觉。
例如,你要查找AUTOSAR代码中Os Timer相关的某些函数,这些函数有些特征,带有Os_和Pit的字符,那么你可以用linux上的grep命令或者用vscode的正则表达式功能Os_\w+Pit\w+来查找。
微信图片_20210205134229.png
上面这个\w就是匹配word的意思。其实,原理跟上一个例子类似,原理很简单。
实际上,“匹配或者查找”是正则表达式最基本的功能了。
3. 爬取和解析一些不可描述的内容
正则表达式还能不能干点刺激的事情呢?
我有个朋友(别问我朋友是谁,有没有他的联系方式……)。他为了下载某些小视频,硬生生地学会了爬虫,然后,下载了一堆封面图片和一些不可描述的文字描述,还有BT种子,我问他有多少,他说1TB的硬盘快满了……
我问他是怎么做到的,他说他用了BeautifulSoup库来爬的,傻瓜式的,很简单,大有要传授我这些秘技的样子。他还按番号做了分类,每一类番号,还生成一个markdown文本,其中用的最多的就是Regex,例如某类番号可以用ABC-\d+筛选出来。
搞完后,他“握草”了好几次,惊叹这个小小的岛国,怎么可以拍这么多这些不可描述的小视频,而且还……(此处省略255个字)
我很好奇,这个爬虫这么好玩?我专门研究了下这个爬虫神器BeautifulSoup,其中很多方法是支持正则表达式的,如re.compile('[a-z]+-[0-9]+',re.I).findall(str_temp)。用起来简直是如虎添翼……
玩归玩,正则表达式在我眼里应该多干些正经事的。
4.  批量格式化处理
我有一堆16进制数,我想用到C代码里面,例如将下面的内容加上0x和逗号,怎么搞?
01234567
( a5 F; ~. z8 g, N  k 89ABCDEF
3 f+ ?+ C2 ^: G: V4 h9 D# U( E  A& s 1011121314151617
5 r$ @4 ^7 V$ u4 |, \% j 18191A1B1C1D1E1F
0 h" H$ W: B$ p5 P# @ 2021222324252627* x! h" Y, B# ^6 Z( h
28292A2B2C2D2E2F
作为一个很懒的程序员,我肯定不会一个个添加的。试试这个:
查找目标: (\w+)[\s!\n]
替换为:0x\1,
微信图片_20210205134241.png

1 I5 _3 z0 `$ Y$ b: Z; P4 N8 d
(\w+)就是那一个个十六进制数,这个括号的作用,就先记录一下,把它放一个分组里面,等下还要用。
[\s!\n]又是啥玩意?中括号的意思,就是匹配中括号里面任意一个内容,\s就是空字符,包括空格、换行符、TAB等。\n就是换行啦,而!\n呢,非换行咯。整个意思就是,匹配任意不包含换行符的空字符。
下面,这个0x\1,中的\1就是上面查到的分组的内容。
5.  将数据格式化后复制到Excel
上面的例子有点啰嗦了,看个简单的,有以下数据,想将其中的0x和逗号去掉,并复制到Excel中。
0x20, 0x21,   0x22, 0x23,   0x24,   0x25, 0x26, 0x27, 0x28,     . j4 z$ J& L% T1 L
0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
8 L) e) r* y3 D" a 0x30, 0x31, 0x32,   0x33, 0x34, 0x35, 0x36, 0x37,   0x38, 0x39,   0x3A, 0x3B,   0x3C, 0x3D, 0x3E, 0x3F,
! |3 [7 Y1 p# _2 J3 Y, O 0x40,  
实际需要分两步:
  • 想将其中的0x和逗号去掉;
  • 复制到Excel中(需要将多余的空格换成Tab字符,才能将多个数值分别填到不同单元格中)。
    - c! ?" q3 K- W8 u& Z
按照上面的例子,需要:
查找目标: 0x(\w+),\s+
替换为:\1\t
微信图片_20210205134243.png
自己领悟一下,哈哈!雕虫小技,还有没有别的?
6. 代码生成与格式化
现有播放器很多个命令,我想将其生成对应的函数,怎么办?
命令:
play
4 {; s) j8 I7 p+ f2 D: v3 b pause' z7 ]' k3 u- i% ^; g* Q
stop
" I6 s7 n+ `7 @ prev: B( {$ r. [6 a9 E8 f
next( U$ R0 K: w+ o" t, C+ i+ K
fastforward! }+ p" O) o& q7 L" ?/ D- D2 K2 n
fastrewind
" D9 O9 c  X. M3 K+ h ……
函数:
BOOL player_play_cmd_func(void* p)
: ~( ]+ p) m( S% F% M  v {
# ]% Q' @2 k7 O* b) J5 ^7 S     
2 x- Z  e* h1 X4 s6 a4 b- ?% [  K }/ W+ M! Q2 ^2 B7 s3 y1 T/ l

* w1 {8 L; k4 I$ x5 y5 m5 [ BOOL player_pause_cmd_func(void* p)
& Q+ F; u" C2 j" d$ ~; v {. j& Y: [" K# U+ f% G
     + c, ^3 [4 J4 P3 e) ~. R: ]5 w
}
( l0 g: x* Z: d# g  W* ^( b ……
一个个手动敲进去?我这么懒,才不呢。
试试这个:
查找目标: ^(\w+)$
替换为:BOOL player_\1_cmd_func\(void* p\)\n{\n\n}\n
微信图片_20210205134246.png
好像都很简单啊,有没难一点的啊!
7.  删除不含某些信息的的内容
匹配查找包含某些信息的内容倒是容易,怎么匹配不包含的内容啊?
例如,我想删掉不是.mid后缀的内容,怎么搞?
2009/06/11 05:22           24,253 flourish.mid
8 B9 p5 R% m1 K. A+ J+ p 2009/06/11 05:24           118,060 ir_begin.wav7 a# n4 l$ \: U' m  `
2009/06/11 05:24           126,252 ir_end.wav3 L% x. {6 n6 f" w4 r" {
2009/06/11 05:24           178,732 ir_inter.wav$ e2 B% O& m' a1 Q; }
2009/06/11 05:22           228,396 notify.wav" w3 A$ @. m& Z  Q% g& @
2009/06/11 05:22           40,075 onestop.mid
1 @$ E, W- A) i, t; ^) I( x 2009/06/11 05:22           111,788 recycle.wav2 X* ^2 r( Z, D  R1 w, a( p/ g+ Q
2009/06/11 05:22           88,236 ringout.wav
' a0 u- V3 T- F  B 2009/06/11 05:22           22,097 town.mid
试试这个:
查找目标:^((?!(2009.*\.mid$)).)*$
替换为:
看不懂?好好研究下!哈哈哈……
7.  搭上脚本语言的快车
在Python、Ruby、Perl、JavaScript上用正则表达式,简直会爽到飞起来……前提你要学会正则表达式各种语法。

7 b. J5 S. y1 v
赞 收藏 评论2 发布时间:2021-2-5 13:44

举报

2个回答
jundao721 回答时间:2021-2-6 08:50:28
给你点个赞
mstwoow 回答时间:2021-2-16 05:52:52
给你点个赞
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版