正则表达式是包含文本和特殊字符的字符串,该字符串描述一个可以识别各种字符串的模式
.
匹配任意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 ——"))
结果如下:
[' ', '—', '—']
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']
^
匹配字符串开头 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']
首先了解下flags值的含义,具体如下:
使.匹配包括换行在内的所有字符
使匹配对大小写不敏感
做本地化识别(locale-aware)匹配,法语等
多行匹配,影响^和$
该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B
生成一个正则表达式对象,供 match() 和 search() 这两个函数使用
re.compile(pattern,flags=0)
整个字符串中匹配
re.search(pattern, string, flags=0)
如下:
print(re.search('com', 'www.baidu.com'))
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匹配整个字符串,直到找到一个匹配。
findall字符串中找到正则表达式所匹配的所有子串,并返回一个列表
re.findall(pattern, string, flags=0)
finditer字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回
re.finditer(pattern, string, flags=0)
split将字符串按照正则表达式分隔,返回一个列表
re.split(pattern, string[, maxsplit])
sub用于替换字符串中的匹配项,将字符串根据正则表达式用参数二替换,返回一个替换后的字符串
re.sub(pattern, repl, string, count)
subn返回替换个数,并以元组形式返回(字符串,替换个数)
subn(pattern, repl, string, count=0, flags=0)
match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
返回被 RE 匹配的字符串
返回匹配开始的位置
返回匹配结束的位置
返回一个元组包含匹配 (开始,结束) 的位置
返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
在整个表达式匹配成功的前提下,尽可能少的匹配,量词后面直接加上一个问号”?”就变成了飞非贪婪,具体量词有5个,分别为:*,+,?,{m},{n,m}
a = re.findall(r"a(\d+?)",'a23ba23')
print(a)
正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配,python中默认采用的是贪婪模式
b = re.findall(r"a(\d+)",'a23ba23')
print(b)