python.正则表达式
简介
正则表达式是对字符串的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则的字符串”,此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在,而非python独有。
匹配规则
字符 | 注释 | 检索字符串 | 表达式 | 成功匹配对象 |
---|---|---|---|---|
. | 匹配除换行符(\n)以外的任意字符 | 123456 | ... | 123 |
^ | 匹配字符串的开始,多行内容时匹配每一行的开始 | 123456 | ^123 & ^23 | 123 & None |
$ | 匹配字符串的结尾,多行内容时匹配每一行的结尾 | 123456 | 456$ & 56$ | 456 & None |
* | 出现0次或无限次,也就是第0个字符 | 123456 | 4* | “ ” |
? | 出现0次或1次,也是第0个字符 | 123456 | 4? | “ ” |
+ | 前一个字符至少出现1次 | 123456 | 4+ | 4 |
\d | 匹配数字:0~9 | 12345@ | \d | 1 |
\D | 匹配非数字字符 | 12345@ | \D | @ |
\s | 匹配空格字符(\t,\n,\r,\f,\v) | 1 6 | \s\s\s | " " |
\S | 匹配非空格字符(\t,\n,\r,\f,\v) | 1 6 | \S | 1 |
\w | 匹配任意字母\数字\下划线 | 1z_@ | \w\w\w | 1z_ |
\W | 匹配非单词字符 | 1z_@ | \W | @ |
[0-9] | 指定一个范围数字集 | 12abCD蔡 | [0-9][0-9] | 12 |
[a-z] | 指定一个范围小写字母集 | 12abCD蔡 | [a-z][a-z] | ab |
[A-Z] | 指定一个范围大写字母集 | 12abCD蔡 | [A-Z][A-Z] | CD |
[\u4e00-\u9fa5] | 指定一个范围汉字集 | 12abCD蔡 | [\u4e00-\u9fa5] | 蔡 |
{n} | {n}前面的原子出现了n次 | 123456 | \d{5} | |
{n,} | {n}前面的原子出现了无限次 | 123456 | \d{5,} | 123456 |
{n,m} | {n}前面的原子出现了n-m次 | 123456 | \d{2,4} | 1234 |
[] | 字符集,对应位置上可以是字符集里的任意字符 | 14201974 | 20[251]9 | 2019 |
示例:
import re # 导入正则模块
tel = "0755-12345678" #实例化一个检索对象
pat = r"2[0567][1789]\d{5}|\d{4}-\d{8}" #实例化表达式
print(re.findall(pat, tel)) # 在检索对象中按照表达式进行检索并打印
>>> ['0755-12345678'] # 返回值
re模块
此模块主要方法如下
re.match() #尝试从字符串的起始位置匹配一个模式(pattern),如果不是起始位置匹配成功的话,match()就返回None
re.search() #函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
re.findall() #遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
re.compile() #编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
re.sub() #使用re替换string中每一个匹配的子串后返回替换后的字符串。
re.subn() #返回替换次数
re.split() #按照能够匹配的子串将string分割后返回列表。
match()
re.match(pattern, string, flags=0)
pattern:正则表达式(或者正则表达式对象) string:要匹配的字符串 flags:修饰符
尝试从字符串的起始位置匹配一个模式(pattern) 如果不是起始位置匹配成功的话 match()就返回None
import re
strr = "javapythonhtml"
result = re.match('.*python',strr)
print(result)
print(result.group()) # .group()表示的是返回正则匹配的结果
print(result.span()) # .span()表示返回正则匹配的范围
>>> <re.Match object; span=(0, 10), match='javapython'>
>>> javapython
>>> (0, 10)
search()
re.search(pattern, string, flags=0)
pattern:正则表达式(或者正则表达式对象) string:要匹配的字符串 flags:修饰符
re.match()和re.search()用法类似唯一的区别在于re.match()从字符串头开始匹配,若头匹配不成功,则返回None
import re
strr = "javapythonhtml"
result = re.match('python',strr)
print(result)
print(result.group()) #
print(result.span())
>>> <re.Match object; span=(4, 10), match='python'>
>>> python
>>> (4, 10)
finall()
re.finditer(pattern, string, flags=0)
pattern:正则表达式(或者正则表达式对象 string:要匹配的字符串 flags:修饰符
返回一个顺序访问每一个匹配结果(Match对象)的迭代器 找到 RE 匹配的所有子串 返回数组
import re
strr ="-------python---------------python-----------------\
------python-------------------python------------------"
result = re.findall(r'python', strr)
print(result)
>>> ['python', 'python', 'python', 'python']
finditer()
re.finditer(pattern, string, flag)
pattern:正则表达式(或者正则表达式对象 string:要匹配的字符串 flags:修饰符
返回一个顺序访问每一个匹配结果(Match对象)的迭代器 找到 RE 匹配的所有子串 返回形式为迭代器
import re
strr ="-------python---------------python-----------------\
------python-------------------python------------------"
data = re.finditer(r"python",strr)
list1 = []
for i in data:
list1.append(i.group())
print(list1)
>>> ['python', 'python', 'python', 'python']
compile()
re.compile(pattern,flags=0)
pattern:正则表达式(或者正则表达式对象) flags:修饰符
编译正则表达式模式 返回一个对象的模式
import re
strr ="-------python---------------python-----------------\
------python-------------------python------------------"
result = re.compile(r"python")
print(result.findall(strr))
>>> ['python', 'python', 'python', 'python']
sub()
re.sub(pattern, repl, string, count=0, flags=0)
pattern:正则表达式(或者正则表达式对象) repl:替换的字符串 string:要匹配的字符串 count:要替换的个数 flags:修饰符
用于替换字符
import re
strr = "hello 111,hello 222"
result = re.sub(r"\d+", "666", strr)
print(result)
>>> hello 666,hello 666
split()
re.split(pattern, string,[maxsplit])
正则表达式(或者正则表达式对象)string:要匹配的字符串 maxsplit:用于指定最大分割次数 不指定将全部分割
用于分割字符
import re
strr = ",leesin,hasaki,zed,,javen,,,"
pat = re.compile(r",+")
result = re.split(r",+",strr,3)
print(result
>>> ['', 'leesin', 'hasaki', 'zed,,javen,,,']