python正则表达式(上)

本文介绍了Python中正则表达式的基本概念和使用方法,包括match方法、元字符、预定义字符集以及贪婪与非贪婪模式。通过实例解析了正则表达式在表单验证和爬虫等场景的应用,并详细解释了各种特殊字符的功能。
摘要由CSDN通过智能技术生成

正则表达式

  • 概念 —— 是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
  • 应用场景
    1. 表单验证(如:邮箱、手机号、身份证…)
    2. 爬虫
  • 正则表达式库 —— re模块
  • 用法:
    import re

方法

match方法

  • 用法:
    re.match(pattern, string, flags=0)
    pattern是正则表达式的模板
    string是表示要匹配的数据
    flags是标志位,用于控制正则表达式的匹配方式。如:是否区分大小写、是否多行匹配等
    • 如果匹配成功返回match对象,否则返回一个None
    • 只匹配从头开始的数据,否则返回None

元字符

字符含义
.表示匹配除换行符外的任意字符。通过设置re . DOTALL标志可以使用(.)匹配任何字符(包含换行符)
|A|B,表示匹配正则表达式A或者B
^匹配输入字符串的开始位置,如果设置了re . MULTILINE标志,^ 也匹配换行符之后的位置。如果在中括号([ ])中 ^ 表示取反的意思。
$匹配输入字符串的结束位置。如果设置了re **.**MULTILINE标志,$也匹配换行符之前的位置。
\1、将一个普通字符变成特殊字符,如:\d表示匹配所有十进制数字。2、解除元字符的特殊功能,如:\. 表示匹配点号本身。3、引用序号对应的子组所匹配的字符串。
[…]1、字符类,匹配所包含的任意一个字符。2、连字符(-),如果出现在字符串中间表示字符范围描述;如果出现在首位则作为普通字符。3、特殊字符仅有反斜杠(\)保持特殊含义,用于转义字符;其他特殊字符,如*、+、?等均作为普通字符匹配。4、脱字符(^)如果出现在首位则表示匹配不包含其中的任意字符;如果出现在字符串中间则仅作为普通字符匹配。
{M,N}M和N均为非负整数,其中M<=N,表示前面的RE匹配M ~ N次。{M,}表示至少匹配M次;{,N}等价于{0,N};{N}表示需要匹配N次。
*匹配前面的子表达式零次或多次,等价于{0,}
+匹配前面的子表达式一次或多次,等价于{1,}
?匹配前面的子表达式零次或一次,等价于{0,1}
(…)匹配小括号中的正则表达式,或者指定一个子组的开始和结束位置。注:子组的内容可以在匹配之后被‘\数字’再次引用,如:(\w+)\1会匹配字符串‘switch switch.com’中的’switch switch’(有空格)
  • . 字符 —— 表示除换行符以外的任意字符
re.match(r'a.c','abc').group()	# 'abc'
re.match(r'a.c','a9c').group()	# 'a9c'
re.match(r'a.c','a\tc').group()	# 'a\tc'
re.match(r'a.c','a\nc').group()	# AttributeError: 'NoneType' object has no attribute 'group'
  • | 字符 —— 逻辑或操作符
re.match(r'a|c','abc').group()	# 'a'
re.match(r'a|c','cab').group()	# 'c'
re.match(r'a|c','bca').group()	# AttributeError: 'NoneType' object has no attribute 'group'
  • [ ] —— 匹配字符集中的一个字符
re.match(r'[abc]','cba').group()	# 'c'
re.match(r'[abc]','bac').group()	# 'b'
re.match(r'[abc]2','a2').group()	# 'a2'
re.match(r'哈利波特[1234567]','哈利波特3').group()	# '哈利波特3'
# 连字符(-)
re.match(r'哈利波特[1-7]','哈利波特6').group()		# '哈利波特6'
re.match(r'哈利波特[1-7]','哈利波特8').group()		# AttributeError: 'NoneType' object has no attribute 'group'
# 脱字符(^)取反
re.match(r'哈利波特[^1-7]','哈利波特8').group()		# '哈利波特8'
re.match(r'哈利波特[^1-7]','哈利波特\n').group()		# '哈利波特\n'
# 转义符(\)
re.match(r'哈利\.波特','哈利.波特').group()			# '哈利.波特'
  • ()子组开始和结束的位置
re.match(r'(([0-1]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([0-1]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])','192.168.1.1 = IP Addr').group()
# '192.168.1.1'
  • {}字符 —— 重复字符
re.match(r'a{3}','aaabbb').group()		# 'aaa'
re.match(r'a{3}','ababab').group()		# AttributeError: 'NoneType' object has no attribute 'group'
re.match(r'a{1,3}','ababab').group()	# 'a'
re.match(r'a{1,3}','aabbab').group()	# 'aa'
re.match(r'a{1,3}','aaabbb').group()	# 'aaa'
  • * 字符 —— 匹配前面的子表达式零次或多次
re.match(r'a*','ababab').group()	# 'a'
re.match(r'a*','aaabbb').group()	# 'aaa'
re.match(r'a[b-z]*','abcdef').group()	# 'abcdef'
re.match(r'a[b-z]*','aabbcc').group()	# 'a'
  • + 字符 —— 匹配前面的子表达式一次或多次
re.match(r'a[b-z]+','abcdef').group()	# 'abcdef'
re.match(r'a[b-z]+','aabbcc').group()	# AttributeError: 'NoneType' object has no attribute 'group'
re.match(r'a[b-z]+','ababab').group()	# 'ab'
  • ? 字符 —— 匹配前面的子表达式零次或一次
re.match(r'a[b-z]?','abcdef').group()	# 'ab'
re.match(r'a[b-z]?','a1').group()		# 'a'
  • $ 字符 —— 结尾字符
re.match(r'\w+@qq.com','1234@qq.com.cn').group()	# '1234@qq.com'
re.match(r'\w+@qq.com$','1234@qq.com.cn').group()	# AttributeError: 'NoneType' object has no attribute 'group'
re.match(r'\w+@qq.com$','139@qq.com').group()		# '139@qq.com'
  • ^ 字符 —— 开头字符
re.search(r'hero','I am a hero.').group()		# 'hero'
re.search(r'^hero','I am a hero.').group()		# AttributeError: 'NoneType' object has no attribute 'group'
re.search(r'^hero','hero is me.').group()		# 'hero'

预定义字符集

字符含义
\d任意一个数字,0~9中的任意一个
\w任意一个字母或数字或下划线,也就是A~Z,a~z,0~9和_中的任意一个
\s空格、制表符、换行符等空白字符的其中任意一个
\D\d的反集,也就是非数字的任意一个字符,等同于[^\d]
\W\w的反集,等同于[^\w]
\S\s的反集,等同于[^\s]
\A匹配输入字符串的开始位置
\Z匹配输入字符串的结束位置
  • \d 字符
re.match(r'\d','139').group()	# '1'
re.match(r'\d','a139').group()	# AttributeError: 'NoneType' object has no attribute 'group'
  • \w 字符
re.match(r'\w','abc').group()	# 'a'
re.match(r'\w','987').group()	# '9'
re.match(r'\w','_hero').group()	# '_'
re.match(r'\w','Hero').group()	# 'H'
re.match(r'\w','#abc').group()	# AttributeError: 'NoneType' object has no attribute 'group'
  • \s 字符
re.match(r'\s', ' ').group()	# ' '
re.match(r'\s', '\t').group()	# '\t'
re.match(r'\s', '\n').group()	# '\n'
  • \D \W \S 字符
re.match(r'\D',' ').group()		# ' '
re.match(r'\D','Hero').group()	# 'H'
re.match(r'\W','@surprise').group()	# '@'
re.match(r'\S','Number').group()	# 'N'	

贪婪与非贪婪模式

字符含义
*?,+?,??默认情况下,*、+和?的匹配模式是贪婪模式(即会尽可能多的匹配符合规则的字符串);*?、+?和??表示启用非贪婪模式。如字符串‘switchhh’,正则表达式switch+会匹配整个字符串,而switch+?则匹配’switch’
{M,N}?启用非贪婪模式,即只匹配M次
  • 最常用的非贪婪模式(.*?)
re.match(r'<div>.*</div>','<div>abc</div><div>bcd</div>').group()	# '<div>abc</div><div>bcd</div>'
re.match(r'<div>.*?</div>','<div>abc</div><div>bcd</div>').group()	# '<div>abc</div>'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值