【示例】匹配手机号码
print('---------电话号码-----------')
#pattern='\d\d\d\d\d\d\d\d\d\d\d'#匹配手机号
pattern='1[35789]\d\d\d\d\d\d\d\d\d'#匹配手机号
s='13456788789'
v=re.match(pattern,s)
print(v)
如果要匹配电话号码,需要形如“\d\d\d\d\d\d\d\d\d\d\d”这样的正则表达式。其中表现 了 11 次“\d”,表达方式烦琐。而且某些地区的电话号码是 8 位数字,区号也有可能是 3 位或 4 位数字,因此这个正则表达式就不能满足要求了。正则表达式作为一门小型的语言, 还提供了对表达式的一部分进行重复处理的功能。例如,“*”可以对正则表达式的某个部 分重复匹配多次。这种匹配符号称为限定符。下表列出了正则表达式中常用的限定符。
符号 | 描述 | 符号 | 描述 |
---|---|---|---|
* | 匹配零次或多次 | {m} | 重复 m 次 |
+ | 匹配一次或多次 | {m, n} | 重复 m 到 n 次,其中 n 可以省略,表示 m 到任意次 |
? | 匹配一次或零次 | {m, } | 至少 m 次 |
利用{}可以控制符号重复的次数。
【示例】数量的使用
import re
print(------*的使用------)
pattern = '\d*' #0 次或多次
s = '123abc'
s = 'abc' #这时不是None而是'',因为abc前默认有空
v=re.match(pattern,s)
print(v)
print('-----+的使用---------')
pattern='\d+' #1 次或多次
s='123abc'
s='abc' #这时候是 None
v=re.match(pattern,s)
print(v)
print('-----?的使用---------')
pattern='\d?' #0 次或 1 次
# s='123abc'
s='abc' #这时候是空
v=re.match(pattern,s)
print(v)
print('-----{m}的使用---------') pattern='\d{3}' #出现 m 次
pattern='\d{2}' #出现 m 次
pattern='\d{4}' #出现 m 次
s='123abc'
v=re.match(pattern,s)
print(v)
print('-----{m,}的使用---------') # pattern='\d{3,}' #出现大于 m 次 尽可能满足的都返回
pattern='\d{2,4}' #出现 m 到 n 次
s='1234567abc'
v=re.match(pattern,s)
print(v)
【示例】匹配出一个字符串首字母为大写字符,后边都是小写字符,这些小写字母可有可无
import re
pattern = '[A-Z][a-z]*'
s='Hello world'
s='HEllo world'
v=re.match(pattern,s)
print(v)
【示例】匹配出有效的变量名
import re
pattern='[A-Za-z_][0-9A-Za-z_]*'
pattern='[A-Za-z_]\w*'
# s='a'
s='ab'
s='_ab'
s='2ab'
v=re.match(pattern,s)
print(v)
【示例】匹配出1-99之间的数字
import re
pattern='[1-9]\d?'
s='1'
s='55'
s='99'
s='199'
v=re.match(pattern,s)
print(v)
【示例】匹配出一个随机密码8-20为以内(大写字母 小写字母 下划线 数字)
import re
pattern = '\w{8,20}'
s='12345678'
s='123__456'
v=re.match(pattern,s)
print(v)
在大多数编程语言相同,正则表达式里使用“\”作为转义字符,这就可以能造成反斜 杠困扰。示例如下:
【示例】“\”作为转义字符
s='c:\\a\\b\\c'
print(s)
执行结果为 c:a\b\c
假如你需要匹配文本中的字符“\”,那么使用编程语言表示的正则表达式里将需要 4 个反斜杠“\\”:前面两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反 斜杠后再在正则表达式里转义成一个反斜杠。Python 里的原生字符串很好地解决了这个问 题,使用 Python 的 r 前缀。例如匹配一个数字的“\d”可以写成 r“\d”。有了原生字符串, 再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
【示例】Python 中的 r 前缀的使用
import re
s='c:\\a\\b\\c'
m=re.match('c:\\a\\b',s)
if m is not None:
print('匹配的结果 1:',m.group()) m=re.match('c:\\\\a\\\\b',s)
if m is not None:
print('匹配的结果 2:',m.group())
#使用 Python 中的 r 前缀
m=re.match(r'c:\\a\\b',s)
if m is not None:
print('使用 Python 中的 r 前缀后匹配的结果:',m.group())
执行结果
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界(左右边界) |
\B | 匹配非单词的边界 |
注意:^ 与 [^ m]中的“ ^ ”的含义并不相同,后者“ ^ ”表示“除了….”的意思
【示例】匹配符$的使用
import re
#匹配 qq 邮箱, 5-10 位
pattern = '[\d]{5,10}@qq.com'
#必须限制结尾的
#pattern = '[1-9]\d{4,9}@qq.com$' #正确的地址
v = re.match(pattern,'[email protected]')
#未限制结尾的前提下使用不正确的地址
#v = re.match(pattern,'[email protected]')
print(v)
【示例】匹配符^的使用
import re
#匹配 qq 邮箱, 5-10 位
pattern = '[\d]{5,10}@qq.com'
#必须限制结尾的
#pattern = '[1-9]\d{4,9}@qq.com$'
#正确的地址
v = re.match(pattern,'[email protected]')
#未限制结尾的前提下使用不正确的地址
#v = re.match(pattern,'[email protected]')
print(v)
【示例】\b 匹配单词边界
import re
pattern = r'.*\bab'
#ab 左边界的情况
v = re.match(pattern,'123 abr')
print(v)
pattern = r'.*ab\b'
#ab 为右边界的情况
v = re.match(pattern,'wab')
print(v)
【示例】\B 匹配非单词边界
#ab 不为左边界
pattern = r'.*\Bab'
v = re.match(pattern,'123 abr')
print(v) #ab 不为右边界
pattern = r'.*ab\B'
v = re.match(pattern,'wab')
print(v)