学习不打烊,充电加油只为遇到更好的自己。希望大家如果觉得好的话可以点赞,评论鼓励一下。

最近博主学习了正则表达式,感觉这个正则表达式的学习也非常必要,然后我就花了一点时间帮大家总结了常用的正则表达式供大家学习使用。

如果有需要一定要收藏起来呀,方便之后在进行相应字符匹配的时候使用。

文章目录

  • 正则表达式
  • 正则表达式用在哪里?
  • 正则表达式的符号具体使用
    • 1.点号“.”
    • 2.星号“*”
    • 3.问号“?”
    • 4.“.*”和“.*?”的区别
    • 6.数字“\d”
    • 7.括号“()”
  • 正则表达式的使用方法
    • 1.检验字符的表达式
    • 2.检验数字的表达式
    • 3.检验特殊需求的表达式

正则表达式

在爬蟲開發中,需要把有用的信息從一大段文本中匹配出來,正則表達式是提取信息的方法之一。學好正則表達式,是學好爬蟲的第一步。
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

通過這一章的學習,你將會掌握如下知識:

  • 正則表達式的基本符號

  • 正則表達式的提取技巧

正则表达式用在哪里?

测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。

替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字

根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

正则表达式的符号具体使用

1.点号“.”

一个点号可以代替除了换行符以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号。例如有以下不同的字符串:

# 任务四:找到所有py thon之间的内容
text4 = '''
pyabcthon
py123hon
py谢谢您thon
py'o'thon
'''

这些字符串的前2个字符都是’py’,后四个字符都是‘thon’,只有中间的3个字符不同,如果使用点号表示,那么全部可以变成‘py…thon’,中间有多少个字就用多少个点。

2.星号“*”

一个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)0次到无限次。

# 任务五:找到以下所有字符串
text5 = '''
我是一名爬虫工程师
我是一名爬虫工程师师
我是一名爬虫工程师师师
我是一名爬虫工程师师师师
'''

这些字符串里面,“师”字重复出现,我们用星号来表示,就可以表示为:

‘我是一名爬虫工程师*’
这里请大家一直保持警惕,正则表达式是一段字符串,所以我们要用单引号、双引号甚至三引号(多条规则)将它括起来。

既然星号可以表示它前面的字符,如果它前面的字符是一个点号呢?它能指代什么?例如:

‘我.*师’
它表示在‘我’和‘师’之间出现“任意多个除了换行符以外的任意字符。”这是因为点号表示除换行符以外的任意字符,星号表示它前面的一个子表达式的0次或者无限次。也就是说点号表示内容,星号表示重复次数,组合起来就是“任意多个除了换行符以外的任意字符。”我们看以下字符串都可以用上面的正则表达式来表示:

# 任务六:找到以下所有字符串
text6 = '''
我师
我123师
我python师
我1+1=2这个算式是正确的师
'''

3.问号“?”

问号表示它前面的子表达式0次或者1次。注意这里的问号是英文问号。

# 任务七:找到以下所有字符串
text7 = '''
我师
我师傅
我师傅傅
'''

在这个例子中如果使用’我师傅?’,将匹配到三个结果’我师’, ‘我师傅’, ‘我师傅’。第三行字符串实际上是“我师傅傅”,但是由于’?'的功能是匹配它前面的‘傅’0次或1次,所以最多只会匹配出一个‘傅’,导致最后一个匹配的结果也是‘我师傅’。

问号最大的作用是与点号和星号配合起来使用,构成“.*?”。通过正则表达式来提取信息的时候,用的最多的就是这个组合。

例如下面的字符串,除了最后一个,都可以用’我.*?师’来表示。

# 任务八:找到以下所有字符串
text8 = '''
我师
我123师
我python师
我1+1=2这个算式是正确的师
我的老师我的老师
'''

匹配的结果是:‘我师’, ‘我123师’, ‘我python师’, ‘我1+1=2这个算式是正确的师’, ‘我的老师’, ‘我的老师’。

4.“.”和“.?”的区别

“.”表示匹配一串任意长度的字符串任意次,它将匹配原来的整个字符串,除非在“.”的前后加其他的符号来限定范围。例如“我.*师”,只会匹配“我”到“师”之间的任意内容。

如果在“.”后面加一个问号,它将匹配它前面内容的0次或1次。于是,“.?”的意思就是匹配一个能满足要求的最短字符串。在任务八中,正则表达式“我.*?师”在匹配字符串“我的老师我的老师”时,从‘我’开始匹配,匹配到第一个‘师’时整个表达式匹配成功,就不再继续向右匹配。但整个字符串还未结束,所以在下一次匹配时,是从第二个‘我’开始匹配,然后到第二个‘师’又匹配成功,从而返回第二个‘我的老师’。

“.”代表一种贪婪的匹配模式,即尽可能多的匹配,就是看到合适的想要的,有多少要多少。“.?”代表一种非贪婪模式,只要有一个满足的就结束了,其他再多的也不管。

关于贪婪模式和非贪婪有一篇文章分析的很意思,如有兴趣推荐阅读进一步了解。链接附在文章最后。[3]

5.反斜杠“\”
反斜杠在正则表达式中不能单独使用,需要和其他的字符配合使用来把特殊符号变成普通符号,或者把普通符号变成特殊符号。例如:

# 任务九:找到下面所有字符串
text9 = '''
我的密码藏在这里*abcedf*找到我了吗
我的密码藏在这里*123456*找到我了吗
'''

如果将正则表达式写成’我的密码藏在这里‘.?’找到我了吗’就会出错,因为星号在正则表达式中是有特殊意义的,不能直接使用星号来匹配星号,这时我们就需要用到反斜杠,来告诉计算机这个星号就是一个普通字符,不再具有正则表达式的意义。因此,正则表达式可以写成‘*.?*’。

在正则表达式中将反斜杠和字符组合起来,指代特定的匹配模式

6.数字“\d”

正则表达式中使用“\d”来表示一位数字,d是digit(数字)的首字母。如果要提取2位数字,则用"\d\d"表示,如果是n位数字,则可以与号组合起来使用,如“\d”。

# 任务十:找到下面所有字符串
text10 = '''
我的密码藏在这里123456789,找到我了吗
我的密码藏在这里1,找到我了吗
我的密码藏在这里666666,找到我了吗
'''

上看这些字符串我们用正则表达式可以表示为:‘我的密码藏在这里\d*,找到我了吗’

7.括号“()”

前面讲到的符号仅仅能让正则表达式“表示”一串字符串,如果我们要将上面的三段密码单独提取出来该怎么办?这个问题我们就可以用到括号。括号的作用是将括号里面的内容提取出来。

我们使用正则表达式可以表示为:‘我的密码藏在这里(\d*),找到我了吗’。我们得到的结果是:‘123456789’, ‘1’, ‘666666’。

正则表达式的使用方法

1.检验字符的表达式

中文:^[\u4e00-\u9fa5]{0,}$英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$长度为3-20的所有字符:^.{3,20}$由26个英文字母组成的字符串:^[A-Za-z]+$由26个大写英文字母组成的字符串:^[A-Z]+$由26个小写英文字母组成的字符串:^[a-z]+$由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$1中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$1可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+禁止输入含有~的字符:[^~\x22]+

2.检验数字的表达式

數字^[0-9]*$n位的數字:^\d{n}$至少n位的數字:^\d{n,}$mn位的數字:^\d{m,n}$零和非零開頭的數字:^(0|[1-9][0-9]*)$非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$帶1-2位小數的正數或負數:^(\-)?\d+(\.\d{1,2})?$正數、負數、和小數:^(\-|\+)?\d+(\.\d+)?$有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$非零的正整數:^[1-9]\d*$ 或^([1-9][0-9]*){1,3}$ 或^\+?[1-9][ 0-9]*$非零的負整數:^\-[1-9][]0-9"*$ 或^-[1-9]\d*$非負整數:^\d+$ 或^[1-9]\d*|0$非正整數:^-[1-9]\d*|0$ 或^((-\d+)|(0+))$非負浮點數:^\d+(\.\d+)?$ 或^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0 ?\.0+|0$非正浮點數:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或^(-([1-9]\d*\. \d*|0\.\d*[1-9]\d*))|0?\.0+|0$正浮點數:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或^(([0-9]+\.[0 -9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9 ]*[1-9][0-9]*))$負浮點數:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或^(-(([0-9] +\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)| ([0-9]*[1-9][0-9]*)))$浮點數:^(-?\d+)(\.\d+)?$ 或^-?([1-9]\d*\.\d*|0\.\d*[1-9] \d*|0?\.0+|0)$

3.检验特殊需求的表达式

Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}身份证号(15位、18位数字):^\d{15}|\d{18}$短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$1日期格式:^\d{4}-\d{1,2}-\d{1,2}
一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$钱的输入格式:有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00″, 和没有 “分” 的 “10000″ 和 “10,000″:^[1-9][0-9]*$这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10″ 和 “10.2″ 是通过的:^[0-9]+(.[0-9]{2})?$这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$这样就允许用户只写一位小数。下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$备注:这就是最终结果了,别忘了”+”可以用”*”替代。如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
中文字符的正则表达式:[\u4e00-\u9fa5]双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))空白行的正则表达式:\n\s*\r (可以用来删除空白行)HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

放弃很容易,但坚持很酷。对吧。一起来坚持学习吧

学习无止境,一起来学最好用的正则表达式大全相关推荐

  1. 社区圆桌分享:代码学习无止境,程序员如何规划自己的职业生涯发展?

    CloudWeGo Study Group 是由 CloudWeGo 社区发起的学习小组,开展以 30 天为一期的源码解读和学习活动,帮助新成员融入社区圈子,和社区 Committer 互动交流,并学 ...

  2. 【马红“名师+”研修共同体】“课” 展风采,“研”无止境----教学交流活动(二)

    [马红"名师+"研修共同体]"课" 展风采,"研"无止境 教学交流活动(二) 马红工作室简报 "朔风借以无料峭,激动缱绻寸温情&q ...

  3. 告别无止境的增删改查:Java代码生成器

    对于一个比较大的业务系统,我们总是无止境的增加,删除,修改,粘贴,复制,想想总让人产生一种抗拒的心里.那有什么办法可以在正常的开发进度下自动生成一些类,配置文件,或者接口呢? 有感于马上要做个比较大的 ...

  4. 美国科学院报告《无止境的前沿:科学的未来75年》

    来源:科技咨询频道 作者:刘昊 张志强 曹玲静 编译:刘昊 张志强 曹玲静 (中国科学院成都文献情报中心) 2020年12月17日,美国国家科学院出版报告<无止境的前沿--科学的未来75年> ...

  5. 持续学习+元学习+无监督学习文章调研(七)

    持续学习+元学习+无监督学习文章调研(七) LEARNING TO LEARN WITHOUT FORGETTING BY MAXIMIZING TRANSFER AND MINIMIZING INT ...

  6. Java学习之路 -- Java怎么学?

    文章目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...

  7. 对抗的深度卷积生成网络来学习无监督表示

    对抗的深度卷积生成网络来学习无监督表示 主线为 Alec Radford 与 Luke Metz 等人的论文"Unsupervised Representation Learning wit ...

  8. CSW博客《工作无止境》

    发表时间:2019年11月25日 信息来源:Craigwright.net 有的人和硅谷很多人一道,喜欢去错误地吹捧关于人工智能(AI)的概念,特别是人工智能和自动化会如何取代人类. 这个中的原因是: ...

  9. 深度学习原来还可以这么学!

    最近身边很多朋友在讨论人工智能,讨论人工智能在我们生活中的应用,随之而来就开始讨论深度学习技术,但是由于深度学习的涉及面比较广,对数学的要求比较高,所以想学也不太敢学,生怕认真学了却没学会.其实可能还 ...

最新文章

  1. eclipse里面M2_REPO引用(Maven2安装总结)
  2. git查看 对比未提交_30分钟让你掌握Git的黑魔法
  3. mysql 视图触发器,MySql视图触发器存储过程详解
  4. mysql慢查询单位_MySQL慢查询
  5. GO语言-基础语法:条件判断
  6. 计算机组网配置,计算机组网技术与配置教案..doc
  7. 使用Python判断文件是否为PE文件
  8. GIT创建公钥,并放置远程库
  9. TCP粘包问题的解决方案01——自定义包体
  10. FFmpeg学习(11)——视频转码之-crf参数详解
  11. TiDB DevCon2018.tick(1.20)
  12. 西湖论剑——指鹿为马
  13. 违反GPL协议赔偿50万,国内首例!
  14. 【微信开发】定制消息推送
  15. 功率 dbm vrms vpp mw换算 (正弦波)
  16. 慧安金科黄铃:面对金融欺诈, AI 如何揪出“老赖”
  17. linux内核源码分析之proc文件系统(二)
  18. 51NOD 2370 奈芙莲的护符
  19. Windows常见问题【解决方法汇总】
  20. 白话机器学习算法理论+实战番外篇之LightGBM

热门文章

  1. .NET经典图书推荐(下)
  2. 如何将微信素材库的文章保留格式的复制到自己的博客论坛或者其他素材库
  3. PTA:寻找孪生素数
  4. 大学什么专业会学python-学会python有哪些好处?python抓取知乎神回复
  5. 快手sig3,did设备注册算法
  6. 魏汝盼医学博士 - Judy Zhu Wei, M.D., F.A.C.O.G.
  7. Stack的概念和算法应用
  8. 线性代数方程组数值解法
  9. 规避三方工具带给产品的潜在风险
  10. iOS CRC 校验