正则表达式:
本章主要讲解正则表达式的用法,主要用到python自带的re库
单字符匹配:
import re
# 匹配某个字符串:
text = "abc"
ret = re.match('b',text)
print(ret.group())
# 点(.):匹配任意的字符(除了'\n'):
text = "\nabc"
ret = re.match('.',text)
print(ret.group())
# \d:匹配任意的数字:
text = "aab"
ret = re.match('\d',text)
print(ret.group())
# \D:匹配任意的非数字:
text = "cab"
ret = re.match('\D',text)
print(ret.group())
# \s:匹配的是空白字符(包括:\n,\t,\r和空格):
text = " ab"
ret = re.match('\s',text)
print("="*30)
print(ret.group())
print("="*30)
# \S:非空白字符:
text = "\nab"
ret = re.match('\S',text)
print("="*30)
print(ret.group())
print("="*30)
# \w:匹配的是a-z和A-Z以及数字和下划线:
text = "+bc"
ret = re.match('\w',text)
print("="*30)
print(ret.group())
print("="*30)
# \W:匹配的是和\w相反的:
text = "1bc"
ret = re.match('\W',text)
print("="*30)
print(ret.group())
print("="*30)
# []组合的方式,只要满足中括号中的某一项都算匹配成功:
text = "bc"
ret = re.match('[1b]',text)
print("="*30)
print(ret.group())
print("="*30)
# 使用组合的方式[0-9]\d:
text = "abc"
ret = re.match('[^0-9]',text)
print("="*30)
print(ret.group())
print("="*30)
# 使用组合的方式实现\w:
text = "+bc"
ret = re.match('[^a-zA-Z0-9_]',text)
print("="*30)
print(ret.group())
print("="*30)
多字符匹配:
多字符匹配:
import re
# *:匹配0个或者多个字符:
text = "+abc"
result = re.match('\D*',text)
print(result.group())
# +:匹配1个或者多个字符:
text = "1abc"
result = re.match('\w+',text)
print(result.group())
# ?:匹配前一个字符0个或者1个:
text = "+abc"
result = re.match('\w?',text)
print(result.group())
# {m}:匹配m个字符:
text = "+1abc"
result = re.match('\w{2}',text)
print(result.group())
# {m,n}:匹配m-n之间的个数的字符:
text = "1abc+"
result = re.match('\w{1,3}',text)
print(result.group())
正则表达式常见案例
# 1. 验证手机号码:手机号码的规则是以1开头,第二位可以是34587,后面那9位就可以随意了。
text = "18677889900"
result = re.match("1[34587]\d{9}",text)
print(result.group())
# 2. 验证邮箱:邮箱的规则是邮箱名称是用数字、英文字符、下划线组成的,然后是@符号,后面就是域名了。
text = "myname@163.com"
result = re.match("\w+@[a-z0-9]+\.[a-z]+",text)
print(result.group())
# 3. 验证URL:URL的规则是前面是http或者https或者是ftp然后再加上一个冒号,再加上一个斜杠,再后面就是可以出现任意非空白字符了。
text = "https://baike.baidu.com/item/Python/407313?fr=aladdin"
result = re.match("(http|https|ftp)://\S+",text)
print(result.group())
# 4. 验证身份证:身份证的规则是,总共有18位,前面17位都是数字,后面一位可以是数字,也可以是小写的x,也可以是大写的X。
text = "36530019870716234x"
result = re.match("\d{17}[\dxX]",text)
print(result.group())
开始/结束
# ^:以...开头:
text = "hello world"
result = re.search("^world",text)
print(result.group())
# $:以...结尾:
text = "hello world"
result = re.search("hello$",text)
print(result.group())
正则表达式贪婪和非贪婪
正则表达式的贪婪模式和非贪婪模式的区别:
贪婪模式:从应用角度分析,可以这样认为,贪婪模式,就是在整个表达式匹配成功的前提下,尽可能多的匹配,也就是所谓的“贪婪”,通俗点讲,就是看到想要的,有多少就捡多少,除非再也没有想要的了。
text = "12345"
result = re.search("\d+",text)
print(result.group())
输出结果:12345
非贪婪模式,就是在整个表达式匹配成功的前提下,尽可能少的匹配,也就是所谓的“非贪婪”,通俗点讲,就是找到一个想要的捡起来就行了,至于还有没有没捡的就不管了。
text = "12345"
result = re.search("\d+?",text)
print(result.group())
输出结果:1
从上述例子可以看出,非贪婪模式可以尽可能少的匹配结果,可根据使用场景来确定使用哪一种模式
案例分析
# 案例1:提取html标签名称:
text = "<h1>这是标题</h1>"
result = re.search("<.+?>",text)
print(result.group())
输出: <h1>