Python学习笔记|Python之正则表达式

什么是正则表达式

正则表达式是包含文本和特殊字符的字符串,该字符串描述一个可以识别各种字符串的模式

1.字符

1.1 正则表达式对字符(单个字符)的表示
  • .

匹配任意1个字符(除了\n),注意因为.表示任意一个字符,所以如果匹配‘.’则需要用转义字符.来表示

代码如下:

	print(re.findall('.',"s2a4561b3678 ——"))

结果如下:

	['s', '2', 'a', '4', '5', '6', '1', 'b', '3', '6', '7', '8', ' ', '—', '—']
  • [ ]

匹配[ ]中列举的字符,如果[a-zA-Z0-9],[a-zA-Z]表示所有字母和数字,后者表示所有字母,注意中间没有空格符号。

  • \d

匹配数字,即0-9

代码如下:

	print(re.findall('\d',"s2a4561b3678 ——"))

结果为:

	['2', '4', '5', '6', '1', '3', '6', '7', '8']
  • \D

匹配非数字,即不是数字

代码如下:

	print(re.findall('\D',"s2a4561b3678 ——"))

结果如下:

	['s', 'a', 'b', ' ', '—', '—']
  • \s

匹配空白,即 空格,tab键

代码如下:

	print(re.findall('\s',"s2a4561b3678 ——"))

结果如下:

	[' ']
  • \S

匹配非空白

代码如下:

	print(re.findall('\S',"s2a4561b3678 ——"))

结果如下:

	['s', '2', 'a', '4', '5', '6', '1', 'b', '3', '6', '7', '8', '—', '—']
  • \w

匹配单词字符,即a-z、A-Z、0-9、_

代码如下:

	print(re.findall('\w',"s2a4561b3678 ——"))

结果如下:

	['s', '2', 'a', '4', '5', '6', '1', 'b', '3', '6', '7', '8']
  • \W

匹配非单词字符

代码如下:

	print(re.findall('\W',"s2a4561b3678 ——"))

结果如下:

	[' ', '—', '—']
1.2 正则表达式匹配多个字符:数量的表示
	text = "a aAx aAAy bAAz cAAAk"
  • * 匹配前一个字符出现0次或者无限次,即可有可无
	print(re.findall(r"aA*", text))     #['a', 'aA', 'aAA']
  • + 匹配前一个字符出现1次或者无限次,即至少有1次
	print(re.findall(r"aA+", text)) #['aA', 'aAA']
  • ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
	print(re.findall(r"aA?", text))  #['a', 'aA', 'aA']
  • {m} 匹配前一个字符出现m次
	print(re.findall(r"A{2}",text)) #['AA', 'AA', 'AA']
  • {m,} 匹配前一个字符至少出现m次
	print(re.findall(r"A{1,}",text)) #['A', 'AA', 'AA', 'AAA']
  • {m,n} 匹配前一个字符出现从m到n次
	print(re.findall(r"A{1,2}",text))#['A', 'AA', 'AA', 'AA', 'A']
1.3 正则表达式:匹配边界的问题
  • ^ 匹配字符串开头
	print(re.findall('^s',"s2a4561b3678 ——"))

结果为:

	['s']
  • $ 匹配字符串结尾
	print(re.findall('8$',"s2a4561b3678"))

结果为:

	['8']
  • \b

匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。

	print(re.findall(r'\bs',"s2abc4561b3678 ——"))
	['s']
  • \B 匹配非单词边界,‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
	print(re.findall(r'\babc\b',"abc4561b3678 ——abc"))

结果为:

	['abc']

2.re模块中常用的功能函数

首先了解下flags值的含义,具体如下:

  • re.S(DOTALL)

使.匹配包括换行在内的所有字符

  • re.I(IGNORECASE)

使匹配对大小写不敏感

  • re.L(LOCALE)

做本地化识别(locale-aware)匹配,法语等

  • re.M(MULTILINE)

多行匹配,影响^和$

  • re.X(VERBOSE)

该标志通过给予更灵活的格式以便将正则表达式写得更易于理解

  • re.U

根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B

2.1 compile()
  • 函数原型

生成一个正则表达式对象,供 match() 和 search() 这两个函数使用

	re.compile(pattern,flags=0)
2.2 serach()
  • 函数原型

整个字符串中匹配

	re.search(pattern, string, flags=0)

如下:

	print(re.search('com', 'www.baidu.com'))
2.3 match()
  • 函数原型
	re.match(pattern, string, flags=0)

match匹配,如果匹配成功,则返回一个match object的match对象

print(re.match('www', 'www.baidu.com')) # 在起始位置匹配

如果不是起始位置匹配成功的话,match()就返回None

print(re.match('com', 'www.baidu.com')) # 不在起始位置匹配
  • 总结

match与search区别
1.re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None
2.re.search匹配整个字符串,直到找到一个匹配。

2.4 findall()
  • 函数原型

findall字符串中找到正则表达式所匹配的所有子串,并返回一个列表

	re.findall(pattern, string, flags=0)
2.5 finditer()
  • 函数原型

finditer字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回

	re.finditer(pattern, string, flags=0)
2.6 split()
  • 函数原型

split将字符串按照正则表达式分隔,返回一个列表

	re.split(pattern, string[, maxsplit])
2.7 sub()
  • 函数原型

sub用于替换字符串中的匹配项,将字符串根据正则表达式用参数二替换,返回一个替换后的字符串

	re.sub(pattern, repl, string, count)
2.8 subn()
  • 函数原型

subn返回替换个数,并以元组形式返回(字符串,替换个数)

	subn(pattern, repl, string, count=0, flags=0)

3.match object中的方法

match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

3.1 groups()

返回被 RE 匹配的字符串

3.2 start()

返回匹配开始的位置

3.3 end()

返回匹配结束的位置

3.4 span()

返回一个元组包含匹配 (开始,结束) 的位置

3.5 group()

返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。

4.贪婪匹配与非贪婪匹配

  • 非贪婪模式

在整个表达式匹配成功的前提下,尽可能少的匹配,量词后面直接加上一个问号”?”就变成了飞非贪婪,具体量词有5个,分别为:*,+,?,{m},{n,m}

	a = re.findall(r"a(\d+?)",'a23ba23')
	print(a)
  • 贪婪匹配

正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配,python中默认采用的是贪婪模式

	b = re.findall(r"a(\d+)",'a23ba23')
	print(b)

你可能感兴趣的:(Python)