正则表达式-重复、非重复数量限定符的使用、原生字符及边界字符的使用

表示数量(匹配多个字符)

【示例】匹配手机号码

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)

你可能感兴趣的:(字符串,正则表达式,python)