正则表达式
1.定义:正则表达式是你创建的用来过滤文本的模式。一个程序或者脚本使用你定义的模式来匹配数据,就像数据流过这个程序一样。如果数据匹配这个模式,则它接受处理。如果数据不匹配这个模式,则它拒绝。
正则表达式是通过使用正则表达式引擎实现的。一个正则表达式引擎实际上是一个软件,它解释正则表达式模式,并使用这个模式匹配文本。
2.在python中使用正则表达式需引用re模块,re模块提供的正则表达式常用的函数:
match 从字符串开头查找模式
search 从字符串的任意位置查找模式
findall 查找所有匹配模式的子串并返回一个列表
finditer 查找所有匹配模式的子串并返回一个迭代器
上述的函数接收两个参数,第一个参数是正则表达式模式,第二个参数是应用这个模式的字符串。
2.1编译正则表达式,如果你在代码中经常使用相同的正则表达式,你可以将这个表达式编译并存储在一变量中,然后你可以在代码的任何想进行正则表达式模式匹配的地方使用这个变量,使用compile()函数编译表达式:
Pattern = re.compile(‘[ch]at’)
Pattern.search(‘this is a cat’)
2.2 特殊字符
* . [] () {} + ? $ \ ^ |
(1) ^字符定义了数据流中一行文本的开始的位置的模式,如果该模式出现在开头的位置以外的其他地方,那么这个正则表达式模式失败。功能和match()相同。
re.search(^’books’,’the books store’) 匹配失败
re.search(^’books’,’books are great’)= re.match(‘books’,’books are great’) 匹配成功
(2) $符号查找一行的末尾的模式,你可以在文本模式中,加入这个特殊字符来表示这个模式必须匹配到这行数据的结尾。
re.search(‘book$’,’this is a good book’)
(3) 组合锚(‘^textstring$’)
1)某一行只包含特定的文本模式的数据:re.search(‘^i love lixiangyue$’,’i love lixiangyue’)
2)过滤文本中空字符:re.search(‘^#’,’love’) 匹配失败
re.search(‘’^#,’’) 匹配成功
(4) .字符用来匹配除了换行符外的任意单个字符,点子符必须是某个字符,如果在点的位置没有字符,则模式失败。
re.search(‘.at’,’that is heavy’) 匹配成功
re.search(‘.at’,’at home’) 匹配失败
(5) []字符分类定义一类字符在文本模式中匹配一个位置,如果字符类中的一个字符出现在数据流中,则模式匹配。[]中包含任何你想要包括在这个类中的字符。
[ch] 正则表达式匹配c或者h re.search(‘[ch]at’,’that is a very nice hat’)
[Yy][Ee][Ss] 一个表达式中使用多个字符类 re.search(‘’[Yy][Ee][Ss],’Yes’) 这个正则表达式用于同时覆盖三个位置的大小写字符。
(6) ^字符串取反 在正则表达式模式中,你可以反转一个字符类的结果,可以查找任何不包含在类中的字符。
re.search(‘[^ch]at’,’the cat is sleeping’) 匹配失败
re.search(‘[^ch]at’,’he is at home’) 匹配成功
(7) -连接符,使用连接符在字符类中指定一个字符的范围,需要指定范围的第一个字符、连接符,然后是范围的最后一个字符,正则表达式会把所有在这个范围中的字符包含进来。
[0-9]包含0到9中的所有字符
[a-z] [A-Z]包含a到z、A到Z中字符
[a-ch-m]包含a到c、h到m中的字符
(8) *在一字符后面放一个星号表示这个字符可以在文本中出现0次或多次
re.search(‘ie*k’,’ik’)
re.search(‘ie*k’,’iek’)
re.search(‘ie*k’,’ieek’)
用于处理单词的错误拼写或者在语言中的多种拼写方法。例如在处理美式英语和英式英语单词colour/color
re.search(‘colou*r’,’i bought a new color TV’)
(9) ?表明前面的字符可以出现零次或者一次,这是它的全部,它不匹配重复出现的字符串
re.search(‘be?t’,’bt’)
re.search(‘be?t’,’bet’) 这两种模式匹配成功
re.search(‘be?t’,’beet’) 匹配失败
(10) +表明在它前面的字符可以出现一次或多次,但是必须至少出现一次
re.search(‘be+t’,’bet’)
re.search(‘be+t’,’beet’) 这两种模式匹配成功
re.search(‘be+t’,’bt’) 匹配失败
(11) {}可以指定在正则表达式中重复的限制次数,通常也被称为一个间隔
{m} 正则表达式确定出现m次
{m,n} 正则表达式确定出现至少m次但最多不超过n次
re.search(‘be{1,2}t’,’bet’)
re.search(‘be{1,2}t’,’beet’) 这两种模式匹配成功
re.search(‘be{1,2}t’,’bt’) 匹配失败
(12) |管道符号 允许你指定两个或者多个模式,正则表达式引擎使用逻辑的公式来检查数据流,若任何一个模式匹配文本,则文本通过,若没有模式匹配,则数据流文本失败。
re.search(‘cat|dog’,’the cat is sleeping’)
re.search(‘cat|dog’,’the dog is sleeping’) 这两种模式匹配成功
re.search(‘cat|dog’,’the horse is sleeping’) 匹配失败
(13 )()分组表达式 使用()可以对正则表达式分组,分组后,这个组被当成一个标准字符对待,你可以像对常规字符一样对这个组使用特殊字符。
re.search(‘sat(urday)?’,’sat’)
re.search(‘sat(urday)?’,’saturday’) 这两种模式匹配成功
re.search(‘(c|b)a(b|t)’,’cab’)
模式(c|b)(b|t)匹配任何以第一个分组的字母和第二个分组中的字母的组合。