简单的正则表达式
2017-07-25 本文已影响5人
听城
- 特殊字符
- ^ $ * ? + {2} {2,} {2,5} |
- [] [^] [a-z] .
- \s \S \w \W
- [\u4E00-\u9FA5] () \d
-
常用的6个re中的函数
re.compile(pattern,flag)#根据正则匹配字符串以及附加条件,返回一个pattern对象
re.search(pattern,string)#搜索整个字符串,直到发现符合正则表达式的字符串
re.match(pattern,string)#从头开始检测字符串是否符合正则表达式,必须从字符串的第一个字符开始
re.sub(pattern,replacement,string)#将字符串中根据正则匹配到的字符串用replacement替换
re.split(pattern,string)#根据正则表达式分割字符串,将分割后的字符串放到list中返回
re.findall(pattern,string)#根据正则表达式分割字符串,将找到的所有结果放到list中返回 -
re.match()一些简单的Python示例
import re
line = 'bobby123'
regex_str = "^b.*"#以b开头的任意字符
if re.match(regex_str,line):
print('yes')
import re
line = 'bobby123'
regex_str = "^b.*3$"#以b开头以3结尾的任意字符
if re.match(regex_str,line):
print('yes')
import re
line = 'boooooooobby123'
#regex_str = ".*(b.*b).*"# bb ()为提取字串即提取括号内的内容,其实为反向匹配,贪婪模式
regex_str = ".*?(b.*b).*"#boooooooobb 左面非贪婪模式,从左面开始匹配,后面为贪婪模式
regex_str = ".*?(b.*?b).*"#boooooooob
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#
import re
line = 'booobaaooooobbbaby123'
regex_str = ".*(b.+b).*"# +出现最少一次 bab 贪婪模式一直匹配到最后
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#
import re
line = 'booobaaooooobbbaaaaaaaaby123'
regex_str = ".*(b.{2,5}b).*"# {}前面字符出现的次数,在这里为任意字符出现最少2次最多5次
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#
import re
line = 'boobby123'
regex_str = '((bobby|boobby)123)'
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#boobby123
import re
line = 'boobby123'
regex_str = '([abcd]oobby123)'#[]为里面内容的任何一个
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#boobby123
import re
line = '14782902222'
#regex_str = '(1[48357][0-9]{9})'#[0-9]0-9的任意数字出现9次 14782902222
regex_str = '(1[48357][^1]{9})'#不等于1出现9次
# 区间 任选 [.*]内的字符不在代表特殊含义
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#14782902222
import re
line = '你ss好'
regex_str = '(你\S+好)'#匹配任意非空字符
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#14782902222
import re
line = 'study in 南京大学'
regex_str = '.*?([\u4E00-\u9FA5]+大学)'#提取汉字,不加问号为京大学
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#南京大学
import re
line = 'XXX出生于2001年9月9日'
#line = 'XXX出生于2001/9/9'
#line = 'XXX出生于2001-9-9'
#line = 'XXX出生于2001-09-09'
#line = 'XXX出生于2001-09'
regex_str = '.*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))'#
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#
- re.compile()简要说明
##查找以id为plist并以<div class="page clearfix">结尾的代码
#.*?是一个固定搭配,.和*可以匹配任意多个字符,加上?就是最小匹配,
#也就是我们上面说的非贪婪模式,直白的说就是匹配尽可能短的字符串
#flags定义包括:
#re.I:忽略大小写
#re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
#re.M:多行模式
#re.S:' . '并且包括换行符在内的任意字符(注意:' . '不包括换行符)
#re.U: 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
pattern1 = '<div id="plist".*?<div class="page clearfix">'
str1 = re.compile(pattern1,re.S).findall(html)#
- 正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 '\t')匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模式 | 描述 | |
---|---|---|
^ | 匹配字符串的开头 | |
$ | 匹配字符串的末尾 | |
* | 前面的字符可以重复任意多次 | |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 | |
[...] | 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' | |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 | |
re* | 匹配0个或多个的表达式 | |
re+ | 匹配1个或多个的表达式 | |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 | |
re{ n} | 前面字符出现的次数 | |
re{ n,} | 精确匹配n个前面表达式 | |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 | |
a | b | 匹配a或b |
(re) | G匹配括号内的表达式,也表示一个组 | |
(?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域 | |
(?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域 | |
(?: re) | 类似 (...), 但是不表示一个组 | |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 | |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 | |
(?#...) | 注释. | |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边 | |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 | |
(?> re) | 匹配的独立模式,省去回溯 | |
\w | 匹配字母数字及下划线 | |
\W | 匹配非字母数字及下划线 | |
\s | 匹配任意空白字符,等价于 [\t\n\r\f] | |
\S | 匹配任意非空字符 | |
\d | 匹配任意数字,等价于 [0-9] | |
\D | 匹配任意非数字 | |
\A | 匹配字符串开始 | |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 | |
\z | 匹配字符串结束 | |
\G | 匹配最后匹配完成的位置 | |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er' | |
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er' | |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符 | |
\1...\9 | 匹配第n个分组的内容 | |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式 |