网站建设与管理收获,学校网,有什么专业做心理的网站,怎么做可以直播的网站正则表达式是一种小型、高度专业化的编程语言。适用于任何语言#xff0c;在 Python 中通过 re 模块实现。正则模式被编译成一系列的字节码#xff0c;然后由 C 语言编写的匹配引擎执行。给字符串模糊匹配
正则用于匹配字符串#xff0c;匹配字符串可以完全匹配和模糊匹配在 Python 中通过 re 模块实现。正则模式被编译成一系列的字节码然后由 C 语言编写的匹配引擎执行。给字符串模糊匹配
正则用于匹配字符串匹配字符串可以完全匹配和模糊匹配
**完全匹配**普通字符大多数字符和字母都和自身匹配 re.findall(rose, lialrosetom)**模糊匹配**元字符不需要完全匹配即能匹配成功 . ^ $ * ? { } [ ] | ( ) \
元字符
正则可以使用普通字符进行完全匹配也可以使用元字符进行模糊匹配。正则表达式中所有元字符 . ^ $ * ? { } [ ] | ( ) \ 。
通配符
正则中用一个点.来表示通配符它可以匹配除换行符\n以外任何字符。一个点只能匹配一个字符 re.findall(s..x, abshuxijd)
[shux]开头结尾
正则中尖角号^用于匹配一行字符串的开头$用于匹配一行字符串的结尾。必须以匹配对象开头或结尾才能匹配成功否则匹配失败。 re.findall(r^hello,\d,hello,123)
[hello,123]re.findall(r^hello,\d,hi hello,123)
[]re.findall(rhello,\d$,hello,123)
[hello,123]re.findall(rhello,\d$,hello,123s)
[]重复匹配
不管是点.还是数字匹配\d都只能匹配一个字符或数字。要想匹配多个就要进行重复匹配正则中能够重复匹配的元字符有* ? {}。
元字符描述元字符描述*对星号前面的子表达式匹配重复 [0 ∞] 次对加号前面的子表达式匹配重复 [1 ∞] 次对问号前面的子表达式匹配重复 [01] 次非贪婪模式{n}精确匹配 n 个前子表达式
**星号 ***
星号*可以对它前面的子表达式重复 0 次 或多次。
# 对 abc 的 c 重复 0 到多次即可匹配 ab、abc、abcc、abc...re.findall(rabc*,ab456abc123abccc)
[ab, abc, abccc]加号
加号可以对它前面的子表达式重复 1 次或多次。 re.findall(rabc,ab456abc123abccc) # 即至少有有一个 c
[abc, abccc]问号
问号可以对它前面的子表达式重复 0 次或 1 次。 re.findall(rabc?,ab456abc123abccc)
[ab, abc, abc]大括号 {}
大括号{}可以对它前面的子表达式精确重复几次它有多重模式
{n} 对它前面的子表达式至少重复 n 次{m, n} 对它前面的子表达式重复 m 到 n 次{0, ∞} 相当于星号*{1, ∞} 相当于加号{0, 1} 相当于问号 re.findall(rabc{3},ab456abc123abccc) # c 重复 3 次匹配到 abccc
[abccc]re.findall(rabc{1,3},ab456abc123abccc) # 匹配 abc、abccc
[abc, abccc]re.findall(rabc{1,3},abc456abcc123abccc)
[abc, abcc, abccc]管道符
管道符|表示或a|b 表示 a 或 b。 re.findall(ra|b, abc)
[a, b]re.findall(rka|b, kahbc)
[ka, b]re.findall(rka|b, kahc)
[ka]re.findall(rka|b, ka|bhc)
[ka, b]字符集
在正则表达式中中括号[ ] 表示一个字符集它用来表示一组字符。字符集中除 - ^ \ 有特殊意义外其他元字符都是普通字符。
[mm] 匹配 m 或 n[^mn] 匹配除 m、n 以外的所有字符 re.findall(rabc[de],abcd123abce567)
[abcd, abce]re.findall(r[^de],abcd123abce567)
[abc, 123abc, 567]横杠 -
字符集中横杠-用来表示范围[a-z] 表示 a - z 任意一个字母。 re.findall(rb[a-z], bs)
[bs]re.findall(r[1-9],12ab45)
[1, 2, 4, 5]re.findall(r[1-9],12ab45)
[12, 45]re.findall(r[A-Za-z0-9],12abCD45)
[12abCD45] re.findall(r\d[A-Za-z0-9]\.[a-z],982561639qq.com)
[982561639qq.com]尖角号 ^
尖角号^表示非[^\d] 除数字以外。 re.findall(r[^\d],abc123def)
[abc, def]re.findall(b[^a-z]*, bs213) # s 没有匹配上匹配停止
[b]转义字符 \
反斜杠\表示对某个字符转义可以把普通字符变成特殊字符如\d re.findall(r[\d],abc123def456)
[123, 456]转义字符
转义字符在元字符中是一个比较特殊的存在在字符集里面、外面都有特殊意义。
反斜杠后面跟元字符去除特殊功能如\.其中这个点变成了普通的点反斜杠后面跟普通字符实现特殊功能如\d匹配任何十进制数
转义字符 普通字符 特殊字符
\d匹配任意十进制数相当于 [0-9]\D匹配任何非数字字符相当于 [^0-9]\s匹配任意空白字符相当于 [\t\n\r\f\v]\S匹配任意非空白字符相当于 [^\t\n\r\f\v]\w匹配任意字母数字字符相当于 [a-zA-Z0-9_]\W匹配任意非字母数字字符相当于 [^a-zA-Z0-9_]\b匹配任意一个特殊字符边界如空格、、# 等
\b 在 Python 中本身是有特殊意义的在匹配时需要给它转义或者加上原生字符串 r re.findall(rabc\b,abc123) # \b 匹配的是特殊字符边界abc 后面没有空格匹配失败
[]re.findall(abc\\b,abc 123) # abc 后面有空格匹配成功
[abc]re.findall(rabc\b,abc 123)
[abc]re.findall(rabc\b,abc#123)
[abc]给其他字符加上转义字符时
import rere.findall(c\l,abc\le)
[]re.findall(c\\l,abc\le)
[]re.findall(c\\\\l,abc\le)
[c\\l]re.findall(rc\\l,abc\le)
[c\\l]\w 和 \s 用法示例 re.findall(r\w, 12shdk34_) # 匹配数字字母以及下划线加上匹配多个
[1, 2, s, h, d, k, 3, 4, _]re.findall(r\w, 12shdk34_)
[12shdk34_] re.findall(r\s, 12 shdk 34_) # 匹配空白字符
[ , ]**Tips**在使用正则的时候尽量带上原生字符串 r可以避免不必要的麻烦。 转义字符 元字符 普通字符
给元字符加上转义字符元字符就失去了原有的意义变成了一个普通字符。 re.findall(rwww*, www*)
[www]re.findall(rwww\*, www*) # 要想把 * 也匹配上就要给 * 转义
[www*]贪婪与非贪婪
关于重复匹配正则表达式默认是按照贪婪匹配的方式去匹配即在符合条件的情况下尽可能多的去匹配。而非贪婪匹配恰好与之相反。
贪婪匹配 re.findall(rabc*,abc123abcc) # 尽可能多的匹配* 的范围是 0 或 多次它取了 多 次
[abc, abcc]re.findall(r.,htmltitleHello World/title/html)
[htmltitleHello World/title/html]
启用非贪婪模式只需在表示重复的元字符后面加上一个问号即可 re.findall(rabc*?,abc123abcc) # 尽可能少的匹配* 的范围是 0 或 多次它取了 0 次
[ab, ab]re.findall(r.?,htmltitleHello World/title/html)
[html, title, /title, /html]在贪婪匹配下.*会尽可能多的匹配字符因此它把 123456 匹配了只留下了一个 7 给 \d最后得到的内容是 7 content Hello 1234567 World_This a Regex Demopattern re.compile(r^He.*(\d).*Demo$)re.findall(pattern,content)
[7]有时贪婪匹配匹配的结果并不是我们想要的那样给我们带来了很大不便这时我们就要使用非贪婪匹配比较合适 pattern re.compile(r^He.*?(\d).*Demo$)re.findall(pattern,content)
[1234567]修饰符
正则可以包含一些可选标志修饰符来控制匹配模式修饰符被指定为一个可选的标志。
常见修饰符| 修饰符 | 描述 | 修饰符 | 描述 | | ------ | -------------------------------------------------- | ------ | ---------------------------------------------------------- | | re.I | 使匹配对大小不敏感 | re.L | 使本地化识别locale-aware匹配 | | re.M | 多行匹配影响 ^ 和 $ | re.S | 使 . 匹配包含换行在内的所有字符即点.换行符也能匹配 | | re.U | 根据 Unicode 字符集解析字符。影响 \w \W \b 和 \B | reX | 通过给与你更灵活的格式以便你将正则表达式写的更易理解 |
我们知道点.可以匹配除换行符以外的所有字符但是当遇到换行时就会引发匹配失败
import re
content Hello 1234567 World_This
is a Regex Demo
result re.match(r^He.*?(\d).*?Demo$,content)
print(result.group(1))---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
ipython-input-2-bd9088917b1a in module()3 is a Regex Demo4 result re.match(r^He.*?(\d).*?Demo$,content)
---- 5 print(result.group(1))AttributeError: NoneType object has no attribute group之所以会报没有 group 方法是因为我们使用了点.匹配任意字符但是不能匹配换行符也就匹配失败。而我们又调用了 group 方法针对这种情况我们只需在 match 方法最后添加一个 re.S 的修饰符即可以便使点.能匹配换行
result re.match(r^He.*?(\d).*?Demo$,content,re.S)1234567分组
分组优先匹配组里面的内容也只显示括号里面的。要想全部显示可以在括号前面加上?:进行去优先级 re.findall(www\.(baidu|163)\.com, www.baidu.com)
[baidu]# 在分组前面加上 ?: 表示去组的优先级re.findall(www\.(?:baidu|163)\.com, www.baidu.com)
[www.baidu.com] re.findall((abc), abcabcabc)
[abc]re.findall((?:abc), abcabcabc)
[abcabcabc]分组后的结果通过 group() 方法即可取到 re.match(r^th.*?(\d).*?(\d),this is 123456 regex 567)
_sre.SRE_Match object; span(0, 24), matchthis is 123456 regex 567re.match(r^th.*?(\d).*?(\d),this is 123456 regex 567).group()
this is 123456 regex 567re.match(r^th.*?(\d).*?(\d),this is 123456 regex 567).group(1)
123456re.match(r^th.*?(\d).*?(\d),this is 123456 regex 567).group(2)
567另一种分组方式?P组名通过组名取值当匹配的结果有很多时可以这样取值
# 另一种分组方式?P组名 通过组名取值当匹配的结果有很多时可以这样取值 re.search((?Pname[a-z]), rose18john20tom22)
_sre.SRE_Match object; span(0, 4), matchrose re.search((?Pname[a-z]), rose18john20tom22).group()
rose re.search((?Pname[a-z]), rose18john20tom22).group(name) # 名字分组为 name rose re.search((?Pname[a-z])(?Page\d), rose18john20tom22).group(age) # 名字分组为 age 18 re 模块常用方法
match 方法
match(patter, string, flags0) 方法从字符串开始位置匹配如果匹配成功则返回匹配位置以及 match 对象否则返回 None。
第一个参数为正则表达式第二个参数为待匹配的字符串。 re.match(\d, rose56)re.match(\d, 12rose56)
_sre.SRE_Match object; span(0, 1), match1re.match(\d, 12rose56).group()
1search 方法
search(pattern, string, flags0)方法扫描整个字符串搜索正则表达式模式匹配的第一个位置并返回 match 对象。如果没有与之匹配的则返回 None。正则表达式模式即为匹配规则需要用原生字符串来写避免不必要的麻烦。
第一个参数为正则表达式第二个参数为待匹配的字符串。 re.search(rabc, abc123abc)
_sre.SRE_Match object; span(0, 3), matchabc # 返回第一个匹配结果的位置以及 match 对象使用 group() 方法可以拿到匹配结果 result re.search(rabc, abc123abc)result.group()
abc使用 span() 方法可以拿到匹配结果范围 result re.search(rabc, abc123abc)result.span()
(0, 3)split 方法
split(pattern, string, maxsplit0, flags0)分割字符串返回结果存储到列表中maxsplit 为早打分割次数。 re.split( , hi hello six) # 按空格分
[hi, hello, six]re.split([ |], hi hello|six) # 按空格或 | 分
[hi, hello, six]re.split([ab], abc) # 先按 a 分a的左边为空因此分为 和 bc再按 b 分b 的左边为空因此分为 和 c
[, , c]sub 方法
sub(pattern, repl, string, count0, flags0) 方法替换原字符串某个文本第一个参数为正则第二个为替换成的字符串第三个为原字符串第四个为替换次数。并返回替换后的字符串。 re.sub(r\d, A, abcd12df45)
abcdAdfAre.sub(r\d, A, abcd12df45, 1)
abcdAdf45subn() 方法可以返回替换次数 re.subn(r\d, A, abcd12df45)
(abcdAdfA, 2)compile 方法
前面我们都是直接在 re 方法中使用正则re 模块提供了一个 compile() 方法可以将正则编译成正则对象以便匹配规则可以重复使用。
pattern re.compile(r\d)其他方式直接传入正则对象即可 content 2018-11-17 17:18pattern re.compile(r\d{2}:\d{2})result re.findall(pattern,content)result
[17:18]finditer 方法
finditer(pattern, string, flags0) 方法与 findall() 方法类似 不同的是前者将匹配结果封装成一个迭代器而后者将全部匹配结果存为一个列表。 ret re.finditer(\d, ss123dd456)next(ret).group()
123findall 方法
search() 方法返回匹配结果的第一个内容要想获得所有匹配内容。就需要借助 findall(pattern, string, flags0) 方法它会搜索整个字符串并将匹配结果存到一个列表中。若没有匹配成功则返回一个空列表。 re.findall(r\d,12so45ch)
[12, 45]