产生的原因:
文本处理已经成为计算机的常见工作之一对文本内容的搜索,定位,提取是逻辑比较复杂的工作为了快速解决上述问题,产生了正则表达式技术定义: 即文本的高级匹配模式,提供搜索,替代等功能。其本质是一系列由特殊符号组成的字串,这个字串即正则表达式。
匹配原理 : 由普通字符和特殊符号组成字符串,通过描述字符的重复和位置等行为,达到匹配某一类字符串的目的
元字符的使用
元字符含义案例.除了\n,可以匹配任意单字符abc123@#$都能匹配*0-多次[a-z][0-9]*+1-多次[a-z][0-9]+?0-1次[2][a-z]?[]表示范围[a-z] a-z中的任意一个小写字母()分组,或者提升优先级|或者[a-z] | [0-9] 表示任意一个小写字母或者任意一个数字{0,}和 * 一样{1,}和 + 一样{0,1}和 ? 一样\d数字中的一个[0-9]\D非数字[^0-9]\s空白符匹配任意空字符 [ \r\t\n\v\f]\S非空白符与\s相反\w任意普通字符匹配任意普通字符 [_0-9a-zA-Z] 也能匹配普通汉字\W任意非普通字符与\w相反^取反,开始$结束{m,n}m-n次1.元字符: |
匹配规则: 匹配 | 两边任意一个正则表达式
In [21]: re.findall("ab|cd","abcdefghialkjasbab") Out[21]: ['ab', 'cd', 'ab']2.元字符: .
匹配规则:匹配除\n外的任意单字符
In [24]: re.findall("f.o","foo is not fao") Out[24]: ['foo', 'fao']3.元字符 : ^
匹配规则:匹配目标字符串的开头位置
In [30]: re.findall("^Tom","Tom is a boy") Out[30]: ['Tom']4.元字符 : $
匹配规则 : 匹配字符串的结束位置
In [32]: re.findall("Tom$","hi Tom") Out[32]: ['Tom']5.元字符 : *
匹配规则: 匹配前面的字符出现0次或多次
In [33]: re.findall("fo*","fadsfafoooafo") Out[33]: ['f', 'f', 'fooo', 'fo']6.元字符 : +
匹配规则: 匹配前面的字符出现1次或多次
In [36]: re.findall("fo+","fadsfafoooafo") Out[36]: ['fooo', 'fo']7.元字符 : ?
匹配规则: 匹配前面的字符出现0次或1次
In [42]: re.findall("fo?","fasdffoafooooo") Out[42]: ['f', 'f', 'fo', 'fo']8.元字符 : {n}
匹配规则: 匹配前面的字符重复次数
In [43]: re.findall("fo{2}","fasdffoafooooo") Out[43]: ['foo']9.元字符 : {m,n}
匹配规则 : 匹配前面的字符出现 m–n次
In [46]: re.findall("fo{2,4}","fasdfofoooafooooo") Out[46]: ['fooo', 'foooo']10.元字符: [字符集]
匹配规则 : 匹配任意一个字符集中的字符
In [51]: re.findall("^[A-Z][a-z]*","Boy") Out[51]: ['Boy']11.元字符 : [^…]
匹配规则 :字符集取非,除列出的字符之外任意一个字符
[^abc] --> 除a b c之外任意字符
In [54]: re.findall("[^ ]+","a little boy") Out[54]: ['a', 'little', 'boy']12.匹配任意(非)数字字符
元字符 : \d \D 匹配规则: \d 匹配任意数字字符 [0-9] \D 匹配任意非数字字符 [^0-9]
In [57]: re.findall("1\d{10}","18888886666") Out[57]: ['18888886666'] 匹配任意(非)普通字符元字符 : \w \W 匹配规则: \w 匹配任意普通字符 [_0-9a-zA-Z] 也能匹配普通汉字 \W 匹配任意非普通字符
re.findall("\w+","hello#nihao%asdf@adsgdfg!df&") Out[60]: ['hello', 'nihao', 'asdf', 'adsgdfg', 'df'] re.findall("\W+","hello#nihao%asdf@adsgdfg!df&") Out[63]: ['#', '%', '@', '!', '&']14.匹配任意(非)空字符
元字符 : \s 匹配任意空字符 [ \r \t \n \v \f] \S 匹配任意非空字符
In [65]: re.findall("\w+\s+\w+","hello world") Out[65]: ['hello world'] In [66]: re.findall("\S+","hello this is tom") Out[66]: ['hello', 'this', 'is', 'tom']15.匹配字符串位置
元字符 : \A \Z 匹配规则: \A 匹配字符串开头位置 ^ \Z 匹配字符串结尾位置 $
在正则表达式开始和结束位置加上^ $ (或者\A \Z)。表示完全匹配
In [75]: re.findall("\A\d+\Z","123445") Out[75]: ['123445']16.匹配(非)单词边界
元字符 : \b \B 匹配规则 : \b 匹配单词边界位置 普通字符和非普通字符交界认为是单词边界 \B 匹配非单词边界位置
In [81]: re.findall(r"num\b","num#asdf#") Out[81]: ['num'] In [82]: re.findall(r"num\b","numasdf#") Out[82]: []元字符总结
匹配单个字符 : a . \d \D \w \W \s \S [...] [^...] 匹配重复 : * + ? {n} {m,n} 匹配位置 : ^ $ \A \Z \b \B 其他 : | () \贪婪与非贪婪
贪婪模式:尽可能匹配多的
非贪婪模式:尽可能匹配少的
贪婪 ——> 非贪婪 *? +? ?? {m,n}?
正则表达式的子组
可以使用()为正则表达式建立子组,子组可以看做是正则表达式内部操作的一个整体
**子组是在正则表达式整体匹配到内容的前提下才会发挥作用,它不影响正则表达式整体去匹配目标内容这一原则
捕获组 和 非捕获组
格式 : (?P<name>pattern)
re.search(r"(?P<dog>ab)cdef",'abcdefghti').group('dog') Out[130]: 'ab'正则表达式设计原则
正确性 ,能正确匹配到目标内容排他性 ,除了要匹配的内容,尽可能不会匹配与到其他内容全面性 ,需要对目标的各种情况进行考虑,做到不遗漏