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 积分后可见