|
正则表达式(Regular Expression,或者Regex),能干嘛?听说很强悍,很多人用来查找字符串,或者替换某些字符串。 实际上,正则表达式有四个功能:
如果没玩过正则表达式,也看不出这四个功能到底能干嘛。 我刚学那阵,觉得这东西,玩点小儿科的东西还行,能干大事? 后来,越用越多,发现这货在你遇到困境的时候可以力挽千钧。 话说回来,这个东西能装逼吗? 1. 你女朋友喊你查她的号码你女朋友(假如你有)有一天跟你撒娇,她给你一个txt文档,里面存着一个她的号码,让你把她的号码找出来。此时,你不记得她的完整号码了,如果找不出来,晚上就得跪CPU了。刹那间,你想到了,她的号码有这样的数字……771……55(亲亲你……嗯嗯)。于是你,快速用Notepad++打开含有一堆乱七八糟电话号码的文本。查找输入:1\d+771\d+55,然后回车,Bingo!不信,你试试: 15672846712 13892738409 021-82937465 13263748592 18028374732 010-27384762 13877190955 022-2873625 1324353738 1621723839 38293923 48234934 3123372390 1367282902 1356282920 ......
好吧,故事是虚构的,也别幻想你女朋友真的让你查号码了。 简单解释一下,这里面的\d就是表示digital的意思即0-9都可以用\d来描述,而\d+就表示有多个数字。这个是正则表达式中非常简单的应用了。 2. 查找文件中某字符串内容模糊搜索到底怎么搞的,你有想过么?要不先来玩下这个,好像有种“万军之中取人头颅如探囊取物”感觉。 例如,你要查找AUTOSAR代码中Os Timer相关的某些函数,这些函数有些特征,带有Os_和Pit的字符,那么你可以用linux上的grep命令或者用vscode的正则表达式功能Os_\w+Pit\w+来查找。
上面这个\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和逗号,怎么搞? 0123456789ABCDEF 1011121314151617 18191A1B1C1D1E1F 2021222324252627 28292A2B2C2D2E2F 作为一个很懒的程序员,我肯定不会一个个添加的。试试这个: 查找目标: (\w+)[\s!\n] 替换为:0x\1,
(\w+)就是那一个个十六进制数,这个括号的作用,就先记录一下,把它放一个分组里面,等下还要用。 [\s!\n]又是啥玩意?中括号的意思,就是匹配中括号里面任意一个内容,\s就是空字符,包括空格、换行符、TAB等。\n就是换行啦,而!\n呢,非换行咯。整个意思就是,匹配任意不包含换行符的空字符。 下面,这个0x\1,中的\1就是上面查到的分组的内容。 5. 将数据格式化后复制到Excel上面的例子有点啰嗦了,看个简单的,有以下数据,想将其中的0x和逗号去掉,并复制到Excel中。 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 实际需要分两步:
按照上面的例子,需要: 查找目标: 0x(\w+),\s+ 替换为:\1\t
自己领悟一下,哈哈!雕虫小技,还有没有别的? 6. 代码生成与格式化现有播放器很多个命令,我想将其生成对应的函数,怎么办? 命令: playpause stop prev next fastforward fastrewind …… 函数: BOOL player_play_cmd_func(void* p){ } BOOL player_pause_cmd_func(void* p) { } …… 一个个手动敲进去?我这么懒,才不呢。 试试这个: 查找目标: ^(\w+)$ 替换为:BOOL player_\1_cmd_func\(void* p\)\n{\n\n}\n
好像都很简单啊,有没难一点的啊! 7. 删除不含某些信息的的内容匹配查找包含某些信息的内容倒是容易,怎么匹配不包含的内容啊? 例如,我想删掉不是.mid后缀的内容,怎么搞? 2009/06/11 05:22 24,253 flourish.mid2009/06/11 05:24 118,060 ir_begin.wav 2009/06/11 05:24 126,252 ir_end.wav 2009/06/11 05:24 178,732 ir_inter.wav 2009/06/11 05:22 228,396 notify.wav 2009/06/11 05:22 40,075 onestop.mid 2009/06/11 05:22 111,788 recycle.wav 2009/06/11 05:22 88,236 ringout.wav 2009/06/11 05:22 22,097 town.mid 试试这个: 查找目标:^((?!(2009.*\.mid$)).)*$ 替换为: 看不懂?好好研究下!哈哈哈…… 7. 搭上脚本语言的快车 在Python、Ruby、Perl、JavaScript上用正则表达式,简直会爽到飞起来……前提你要学会正则表达式各种语法。 |
| 给你点个赞 |
| 给你点个赞 |
微信公众号
手机版