读正则表达式的笔记
读自己的笔记产生的随笔:正则表达式
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。而findall是返回所有匹配到的字符串
正则表达式
python中的正则表达式就是python的标准库re的方法对象之类的使用
匹配字符串
1.用match方法匹配
成功则会返回个SER_Match对象,但失败却不会报错,饭后None
match('要找的文本','总的文本')
从哪找呢,找到之后返回什么,如何看呢
match是从总的文本中从头开始找,找到一个就返回SER_Match对象。然后我们要用group()这个方法从SER_Match对象中返回匹配成功的字符串
重点:match是从头开始找的,第一个头部没有匹配到则直接返回None
search匹配成功返回的字符串
search匹配的话并不要从头部开始
也可用group()方法和groups()返回匹配到的字符串
匹配多个字符串
使用的是择一匹配符(|),有点或的意思,一连串寻找的文本中,匹配你也可以,匹配我也可以
匹配单个字符串
那就是一个点(.)
字符集
[][][]从括号中任选一个作为寻找的文本。如:假设3个括号中有均各有2个文本,那么就可以匹配222=8次,有8种匹配的对象
重复
表示前一个字符重复0到n次匹配,?表示前一个字符重复0到1次匹配,这就意味着问号(?)前面的字符有可能没有。
+表示前一个字符重复1到n次,这表示前面一个字符一定有。
注意:
a也可以匹配baa,缘由是a*可以匹配空串,任何字符串都可以认为是以空串作为前缀的
可选和特殊字符
/w匹配的是字母或数字,/W匹配的不是字母或数字,/d匹配的是数字
[a-z]表示26个小写字母中的一个
[a-z]{3}小写字母中的3个
[a-zA-Z0-9]1个字母(大写或小写)或一个数字
注意:/w对中文也匹配;但还有个更精确的匹配中文字符的正则表达式: [\u4e00-\u9fa5]
分组
分组采用小括号()
(\d{3})-(\d{4})-([a-z]{2}) 分成三组,来寻找
3个数字-4个数字-2个字母
匹配字符串的起始和结尾
^起始
$结尾
匹配字符串的边界 \b
边界是指单词两侧是空格或标点符号
这样可以更精确的找到自己要匹配的字符串吧
findall和finditer查找每一次出现的位置
查找顺序都是从左到右
findall返回个列表,当然,没有找到匹配的字符串他将返回个空列表,否则,返回的列表顺序是在字符串中一样
finditer返回的是一个迭代器(迭代器自然是迭代对象),只能对finditer返回的结果进行迭代,也就是返回的是对象,直接打印就是打印对象的内存地址。
找到相同的字符,他当然也会写入列表中(写这句是因为查资料说findall返回一个不重复的模式列表,finditer返回的可以是重复的)
搜索替换
sub函数有3个参数,第一个是模式字符串,也就是总字符串中的字符串或者是正则表达式
第二个是要替换的字符串,这个可以自己定义
第三个是总字符串
sub函数直接返回替换的结果,也就是替换完成后的字符串
subn函数与sub函数用法相同,也有3个参数,但他返回的不是已经替换好的字符串,而是返回一个元组,元组中有2个值,第一个是返回替换好的字符串;第二个参数是替换的总数,也就是该字符串被替换了多少次,也许很多次,也许很少,要看匹配的模式字符串在总的字符串中有多少来决定。
分隔字符串 split
3个参数,模式字符串,总的字符串,分隔次数
返回一个列表,列表中的子元素都是被分隔的字符串
常用的正则表达式
邮箱地址:[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z]{2-3}
ip地址:\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
web地址:https?[/]{2}\w.+
web地址正则最扯
贪婪非贪婪
*?, +?, ??
'*', '+',和 '?' 修饰符都是 贪婪的
` <.*>` 希望找到 `'<a> b <c>'`,它将会匹配整个字符串,而不仅是 `'<a>'`。在修饰符之后添加 ? 将使样式以 非贪婪`方式或者 :dfn:`最小 方式进行匹配; 尽量 少 的字符将会被匹配。 使用正则式` <.*?> `将会仅仅匹配 '<a>'。
指定重复次数
对前面的正则表达式指定m此重复,类似于匹配m次返回,原本它只需要返回一次。比如, a{6} 将匹配6个 'a' , 但是不能是5个。正则表达式可以包含普通或者特殊字符。
对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。 比如,a{3,5} 将匹配 3 到 5个 'a'。忽略 m 意为指定下界为0,忽略 n 指定上界为无限次。 比如 a{4,}b 将匹配 'aaaab' 或者1000个 'a' 尾随一个 'b',但不能匹配 'aaab'。逗号不能省略,否则无法辨别修饰符应该忽略哪个边界。
{m,n}?
前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。比如,对于 'aaaaaa', a{3,5} 匹配 5个 'a' ,而 a{3,5}? 只匹配3个 'a'。
如果没有使用原始字符串( r'raw' )来表达样式,则需要使用转义字符'';如果需要使用\原始字符,可以用r''或者\
[]
用于表示一个字符集合。在一个集合中
字符可以单独列出,比如 [amk] 匹配 'a', 'm', 或者 'k'。
可以表示字符范围,通过用 '-' 将两个字符连起来。比如 [a-z] 将匹配任何小写ASCII字符, [0-5][0-9] 将匹配从 00 到 59 的两位数字, [0-9A-Fa-f] 将匹配任何十六进制数位。 如果 - 进行了转义 (比如 [a-z])或者它的位置在首位或者末尾(如 [-a] 或 [a-]),它就只表示普通字符 '-'。
特殊字符在集合中,失去它的特殊含义。比如 [(+)] 只会匹配这几个文法字符 '(', '+', '', or ')'。
字符类如 \w 或者 \S (如下定义) 在集合内可以接受,它们可以匹配的字符由 ASCII 或者 LOCALE 模式决定。
不在集合范围内的字符可以通过 取反 来进行匹配。如果集合首字符是 '^' ,所有 不 在集合内的字符将会被匹配,比如 [^5] 将匹配所有字符,除了 '5', [^^] 将匹配所有字符,除了 '^'. ^ 如果不在集合首位,就没有特殊含义。
在集合内要匹配一个字符 ']',有两种方法,要么就在它之前加上反斜杠,要么就把它放到集合首位。比如, [()[]{}] 和 [{}] 都可以匹配括号。
|
A|B,'|' 分隔开的正则样式从左到右进行匹配。当一个样式完全匹配时,这个分支就被接受。意思就是,一旦 A 匹配成功, B 就不再进行匹配,即便它能产生一个更好的匹配。或者说,'|' 操作符绝不贪婪。 如果要匹配 '|' 字符,使用 |, 或者把它包含在字符集里,比如 [|].
零宽断言
(?=exp)
先行断言,当表达式为真时候,匹配表达式前面的位置(exp表示正则表达式)
(?<exp)
后发断言,当表达式为真时候,匹配表达式后面的位置
(?!exp)(类似三元运算符-反过来)
零宽度负预测先行断言,当表达式不成立时,匹配断言表达式的前面的位置,当表达式成立时,匹配断言表达式后面的位置
(?<!exp)(类似三元运算符)
零宽负回顾后发断言,当断言表达式不成立时,匹配后面的位置,成立时,匹配前面的位置