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

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

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

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

正则表达式

在爬蟲開發中,需要把有用的信息從一大段文本中匹配出來,正則表達式是提取信息的方法之一。學好正則表達式,是學好爬蟲的第一步。
一个正则表达式就是由普通字符(例如字符 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-4405222021-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个月(0109112)^(0?[1-9]|1[0-2])$
一个月的31(0109131)^((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})?$

 	13个数字,后面跟着任意个 逗号+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))

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

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值