python- 正则表达式

简单的说就是,用一小段简单的各种字符的组合,即叫做 正则表达式,去实现复杂的。字符串匹配,查找你到你所需要的内容,以便后期提取出来你所要的内容。
这个听起来很简单,但是很多现实的应用中,所要处理的字符串有千千万万种,各种复杂的字符,而且每个人的需求有无穷尽种,需要提取出的内容也是无穷多。而如果手动处理,写普通的 if else 语句去一点点判断字符串是否相等,则是无法实现的。而用正则,就可以实现如此多的,繁杂的,极度复杂的,各种需求。

一、正则表达式的使用
python re 模块 处理正则表达式

re.findall(pattern,string)
功能:使用正则表达式匹配字符串、
参数:pattern  正则表达式
	  string   目标字符串
ex:
	s = "My email is asjdaf@tedu.cn"
	import re
	re.findall("\w+@\w+\.cn",s)
	['asjdaf@tedu.cn']
	
1、普通字符
	元字符:abc
	匹配规则: 匹配相应的普通字符

	ex:
		In [4]: re.findall("abc","abcdefghig")
		Out[4]: ['abc']

2、或
	元字符:ab|cd
	匹配规则:匹配|两边任意一个正则表达式符合的情况
	ex:
		In [5]: re.findall("ab|cd","abcdefghig")
		Out[5]: ['ab', 'cd']
	注意:
		|两侧不要用没用的空格和共同含有同意字符,如:
		In [6]: re.findall("ab|bc","abcdefghig")
		Out[6]: ['ab']
		只能匹配 ab  不能匹配bc

3、匹配单一字符
	元字符:.
	匹配规则:匹配除了换行之外的任意字符
	ex:
		In [7]: re.findall("f.o","fio is not fao")
		Out[7]: ['fio', 'fao']

		In [2]: re.findall("你.","你好,你坏")
		Out[2]: ['你好', '你坏']

4、匹配开始位置
	元字符:^
	匹配规则:匹配一个字符串的开始位置
	ex:
		In [2]: re.findall("^hello","hello world")
		Out[2]: ['hello']

5、匹配结束位置
	元字符:$
	匹配规则:匹配目标字符串的结束位置
	ex:
		In [3]: re.findall("py$","hello.py")
		Out[3]: ['py']

6、匹配重复
	元字符:*
	匹配规则:匹配前面正则表达式重复0次或多次
	ex:
		In [2]: re.findall(".*","abbcdae")
		Out[2]: ['abbcdae', '']

7、匹配重复
	元字符:+
	匹配规则:匹配前面正则表达式重复1次或多次	
	ex:
		In [3]: re.findall(".+","abbcdae")
		Out[3]: ['abbcdae']

		In [5]: re.findall(".+py$","hello.py")
		Out[5]: ['hello.py']

8、匹配重复
	元字符:?
	匹配规则:匹配前面正则表达式重复0次或1次
	ex:
		In [2]: re.findall("ab?","abcdefa")
		Out[2]: ['ab', 'a']

9、匹配重复
	元字符:{n}
	匹配规则:匹配指定的重复次数
	ab{3} ---->  abbb
	ex:
		In [3]: re.findall("ab{3}","abbbbbbbb")
		Out[3]: ['abbb']

10、匹配重复
	元字符:{m,n}
	匹配规则:匹配前面正则表达式重复m次到n次
	ab{3,5} ---->  abbb  abbbb  abbbbb
	ex:
		In [5]: re.findall("ab{3,5}","ababbbabbbbabbbbbbb")
		Out[5]: ['abbb', 'abbbb', 'abbbbb']

11、匹配字符集合
	元字符:[]
	匹配规则:匹配括号范围内的任意一个字符
	[abc123d] a b c 1 2 3 d
	[a-z]
	[A-Z]
	[0-9]
	ex:
		In [7]: re.findall("[a-z]","abab")
		Out[7]: ['a', 'b', 'a', 'b']

		In [8]: re.findall("[_0-9a-zA-Z]","Hello World 123")
		Out[8]: ['H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd', '1', '2', '3']

12、匹配字符集合
	元字符:[^...]
	匹配规则:匹配除指定字符集之外的任意字符
	ex:
		In [10]: re.findall("[^_0-9a-zA-Z]","Hello World #$%")
		Out[10]: [' ', ' ', '#', '$', '%']

		In [9]: re.findall("[^_0-9a-zA-Z]","Hello World 123")
		Out[9]: [' ', ' ']

13、匹配任意(非)数字字符
	元字符:\d   \D
	匹配规则:\d 匹配任意数字字符      [0-9]
			  \D 匹配任意非数字字符    [^0-9]
	ex:
		匹配电话号码
		In [11]: re.findall("1\d{10}","18817826298")
		Out[11]: ['18817826298']

		In [13]: re.findall("\D+","hello 123")
		Out[13]: ['hello ']

14、匹配(非)普通字符(普通字符:数字字母下划线)
	元字符:\w    \W
	匹配规则:\w  匹配任意一个普通字符   [_0-9a-zA-Z]
			  \W  匹配任意一个普通字符   [^_0-9a-zA-Z]
	ex:
		In [14]: re.findall("\w+","hello_123")
		Out[14]: ['hello_123']

		In [15]: re.findall("\W+","hello&*123")
		Out[15]: ['&*']

15、匹配(非)空字符
	元字符:\s    \S
	匹配规则:\s  匹配任意一个空字符      [ \n\t\r\0]
			  \S  匹配任意一个非空字符   
	ex:
		In [16]: re.findall("\s","hello 123")
		Out[16]: [' ']

		In [18]: re.findall("\s","hello world\r\n\t\0")
		Out[18]: [' ', '\r', '\n', '\t']

		In [17]: re.findall("\S","hello 123")
		Out[17]: ['h', 'e', 'l', 'l', 'o', '1', '2', '3']

		匹配World China:
		In [21]: re.findall("[A-Z]\S+","hello World China nihao ") 
		Out[21]: ['World', 'China']	

16、匹配起止位置
	元字符: \A    \Z
	匹配规则:\A  匹配开始位置
			  \Z  匹配结束位置
	绝对匹配  \Aabc\Z ----abc (且字符串只是abc)	
	ex:
		In [24]: re.findall("\A/\w+/\w+\Z","/football/zhong")
		Out[24]: ['/football/zhong']

17、匹配(非)单词边界
	元字符: \b    \B
	匹配规则:\b  匹配单词边界
			  \B  匹配非单词边界
	单词边界:数字字母下划线和其他字符的交界位置为单词边界
	ex:
		In [25]: re.findall(r"\Bis\b","This is a test")
		Out[25]: ['is']

** 元字符总结:

匹配单个字符: a  .  \d  \D  \w  \W  \s  \S  [...]  [^...]
匹配重复性:   *  +  ?  {n}  {m,n}  
匹配某个位置: ^  $  \A  \Z  \b  \B
其他:         |   ()   \

例 1:匹配长度 8-10 位的密码 必须是以数字开头,数字字母下划线组成

	^[0-9]\w{7,9}$	

例 2:匹配身份证号

	In [9]: re.search("\d{17}(\d|x)","12345678932165424x").group()
	Out[9]: '12345678932165424x'

例 3:匹配邮箱

	^([0-9a-zA-Z_.-])+@([0-9a-zA-Z_-])+(\.([a-zA-Z_-])+)+$

	r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+"
8 打赏
打赏 1 积分后可见