正则匹配
匹配符号
'.',用于匹配除了换行符(/n)之外的所有符号
'^',行首,后面的匹配符号从字符串的开始进行匹配
'$',行尾,前面的匹配符号从字符串的末尾进行匹配
'*',*前面的字符匹配0次或多次(贪婪模式)
'+',+前面的字符匹配1次或多次(贪婪模式)
'?',?前面的字符匹配0次或1次(贪婪模式)
'*?,+?,??',上面三个的非贪婪模式
'{m,n}',前面的字符匹配m-n次(贪婪模式)
'{m,n}?',上面的非贪婪模式
'\\',\是转义字符,在特殊字符前加\,则标识字符本身
'[]',标识一组字符。如果是^开头则表示是补集(非)。如[a-z]标识a-z的字符,[^a-z]标识除了a-z的字母的其他字符
'|',或。如A|B,标识匹配A或B
'(...)',匹配括号内的正则表达式内容,后续可以在字符串中检索或匹配内容
'(?aiLmsux)', 为RE设置A、I、L、M、S、U或X标志。
'(?:...)', 常规括号的非分组版本。
'(?P<name>...)', 给分组自定义名称,分组匹配的子字符串可以通过名称访问。
'(?P=name)', 匹配名为name的组之前匹配的文本。
'(?#...)', 评论;忽略。
'(?=...)', 如果...匹配下一个,但不使用字符串。
'(?!...)', 如果...,下一个不匹配。
'(?<=...)', 如果前面有...(必须是固定长度)。
'(?<!...)', 如果前面没有...(必须是固定长度)。
'(?(id/name)yes|no)', 此正则一般用于前面已经划分了gourp的情况。id和name是gourp的id或者自定义名称。此处详解传送门
特殊字符
\number 匹配相同号码的组的内容
\A 仅在字符串开头匹配。
\Z 仅在字符串结尾匹配。
\b 匹配空字符串,但仅在单词的开头或结尾处匹配。
\B 匹配空字符串,但不匹配单词的开头或结尾。
\d 匹配任何十进制数字;相当于设置[0-9]的字节模式。
\D 匹配任何非数字字符;相当于[^\d]。
\s 匹配任何空白字符;相当于[\t\n\r\f\v]字节模式。
\S 匹配任何非空白字符;相当于[^\s]。
\w 匹配任何字母数字字符;相当于[a-zA-Z0-9_]。
\W 匹配\w的补码。
\\ 匹配一个反斜杠。
使用特殊字符时,本身特殊字符前的\也是需要转义的。或者直接使用r前缀,就不用考虑转义了。
import re
sample_string = 'abcd'
result1 = re.match('\\w+', sample_string)
result2 = re.match(r'\w+', sample_string)
print(result1)
print(result2)
---------------
输出:可以看到两种情况输出结果是一样的。
<re.Match object; span=(0, 4), match='abcd'>
<re.Match object; span=(0, 4), match='abcd'>
re模块
Python中re模块包含了所有正则表达式的功能。
方法
#re模块的方法
match 将正则表达式模式与字符串开头匹配。
fullmatch 将正则表达式模式与所有字符串匹配。
search 在字符串中搜索是否存在模式。
sub 按正则匹配出现的次数,替换字符串。
subn 与sub相同,但也返回替换的数量。
split 按模式的出现次数拆分字符串。
findall 查找字符串中所有能匹配正则表的是的部分。
finditer 返回一个迭代器,为每个匹配生成一个匹配对象。
compile 将模式编译为模式对象。
purge 清除正则表达式缓存。
escape 将字符串中的所有非字母数字反斜杠。
match
因为match是从字符串开头匹配,所以从开头开始匹配字母是有结果的,从开头开始匹配数字得到的结果是空。
import re
sample_string = 'abcd1234321efgh'
result_letter = re.match('[a-z]*', sample_string)
result_number = re.match('[0-9]*', sample_string)
print("匹配字母:", result_letter.group())
print("匹配数字:", result_number.group())
--------------------------
输出:
匹配字母: abcd
匹配数字:
fullmatch
fullmatch需要正则表达式匹配字符串的所有内容。如果正则表达式无法匹配字符串所有内容则返回None。
import re
sample_string = 'abcd1234321efgh'
result_letter = re.fullmatch('[a-z]*[0-9]*[a-z]*', sample_string)
result_number = re.fullmatch('[a-z]*[0-9]*', sample_string)
print("匹配:", result_letter.group())
print("匹配:", result_number)
--------------
输出:
匹配: abcd1234321efgh
匹配: None
search & findall
search只能根据正则表达式搜素到字符串内第一个匹配的内容。如果需要搜索字符串内所有匹配正则表达式的内容,则需要用findall。
import re
sample_string = 'abcd1234321efgh'
result_letter = re.search('[a-z]*', sample_string)
print("匹配字母:", result_letter.group())
result_letter = re.findall('[a-z]{4}', sample_string)
print("匹配字母:", result_letter)
------------------
输出:
匹配字母: abcd
匹配字母: ['abcd', 'efgh']
sub & subn
sub(pattern, repl, string, [count], [flags])
sub('正则匹配规则', '替换的字符串', '被替换的字符串', [定义替换的次数])
repl参数可以字符串也可以是一个可调用的函数,如果是可调用的函数,将会将正则表达式匹配的值转递给函数,并且函数必须返回需要替换的字符串。
import re
def replace(repl):
repl_new = repl.group() + '!'
return repl_new
sample_string = 'liqi,test_example,com'
#普通替换字符串
result = re.sub('[,_]', '.', sample_string)
print("将字符串中,_替换成.", result)
#通过一个可调用的函数处理正则匹配到的值,返回新的需要替换的值。
result = re.sub('[,_]', replace, sample_string)
print("将字符串中,_追加!", result)
#subn和sub一样,但是多返回一个替换次数
result = re.subn('[,_]', '.', sample_string)
print(result)
---------------
输出:
将字符串中,_替换成.: liqi.test.example.com
将字符串中,_追加!: liqi,!test_!example,!com
('liqi.test.example.com', 3)
split
拆分字符串。优势:可以正则匹配多个值。
import re
sample_string = 'liqi,test_example,com'
result = re.split('[,_]', sample_string, 2)
print("拆分后:", result)
-----------------
输出:
拆分后: ['liqi', 'test', 'example,com']
正则匹配分组
(...)-分组示例
import re
sample_string = 'abcd1234321efgh'
result = re.match('([a-z]*)(\d*)', sample_string)
print("匹配字母:", result.group(1))
print("匹配数字:", result.group(2))
-------------------
输出:
匹配字母: abcd
匹配数字: 1234321
\number示例
import re
sample_string = '<html>hello world</html><xxx>'
result = re.match(r'<([a-z]+)>(\w+\s\w+)</\1>', sample_string)
print("标签:", result.group(1))
print("文本:", result.group(2))
---------------
输出:
标签: html
文本: hello world
(?P<name>...) & (?P=name)-给分组自定义命名示例
import re
sample_string = '<html>hello world</html><xxx>'
result = re.match(r'<(?P<mygroup>[a-z]+)>(?P<wordgroup>\w+\s\w+)</(?P=mygroup)>', sample_string)
print("标签:", result.group('mygroup'))
print("文本:", result.group('wordgroup'))
-----------------
输出:
标签: html
文本: hello world