re.subn() #匹配字符串并替换,同时会返回替换次数 re.escape(r'(*+?)') #跳过re的符号功能,表示其本身. re.compile(pattern) re.compile().flags re.compile().pattern re.compile().groupindex #反斜杠的困扰 '''与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。 假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\": 前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。 Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。 同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠, 写出来的表达式也更直观。''' #匹配模式flags flags=re.I(re.IGNORECASE) #忽略大小写(括号内是完整写法,下同) flags=re.M(MULTILINE) #多行模式,改变'^'和'$'的行为(参见上图) flags=re.S(DOTALL) #点任意匹配模式,改变'.'的行为 ---------random---------- random.random() #生成一个0到1的随机浮点数 random.uniform(a,b) #生成一个指定范围a到b的随机浮点数 random.randint(a,b) #生成一个[a,b]的随机整数 random.randrange(a,b,step=c) #步长为c,从[a,b)随机取一个数 random.choice(sequence) #从序列中随机获取一个元素,在python中list、tuple、character都属于sequence random.sample(sequence,k) #从指定序列中获取指定长度k的片段 random.shuffle(sequence) #对序列进行随机排列(洗牌) ---------glob---------- glob.glob(path) # 将路径作为列表返回 ---------OS-------------
>>> re.compile('\w+@\w+\.(com|cn|edu)') re.compile('\\w+@\\w+\\.(com|cn|edu)') >>> pattern = re.compile('\w+@\w+\.(com|cn|edu)') >>> pattern re.compile('\\w+@\\w+\\.(com|cn|edu)') >>> pattern.fullmatch('*****@*****.**') <_sre.SRE_Match object; span=(0, 18), match='*****@*****.**'> 注:先编译好规则,并赋值给一个变量,再通过变量去fullmatch一个字符串 这样的做法与直接fullmatch一个字符串是没有区别的,只不过这样做对于大批量的正则匹配会提高效率 ################################## flags标志符 ################################### re.I(re.IGNORECASE):忽略大小写 M(MULTILINE):多行模式,改变'^'和'$'的行为 S(DOTALL):改变'.'的行为, X(re.VERBOSE)可以给你的表达式写注释,使其更可读 例题: >>> re.search('a','alex') <_sre.SRE_Match object; span=(0, 1), match='a'> >>> re.search('a','Alex') >>> re.search('a','Alex',re.I) <_sre.SRE_Match object; span=(0, 1), match='A'> 例题: >>> re.search('foo.$','foo1\nfoo2\n')
# re.match #从头开始匹配 # re.search #匹配包含 # re.findall #把所有匹配到的字符放到以列表中的元素返回 # re.splitall #以匹配到的字符当做列表分隔符 # re.sub #匹配字符并替换 import re #'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})", "371481199306143242").groupdict("city") # {'province': '3714', 'city': '81', 'birthday': '1993'} re.search('(?P<province>[0-9]{6})(?P<birthday>[0-9]{8})(?P<houxu>[0-9]{4})', '441481199510043339').groupdict('houxu') # {'province': '441481', 'houxu': '0433', 'birthday': '199510'} ##替换 re.sub() re.sub('[0-9]+', '|', 'abc12de34f5g6h') # 'abc|de|f|g|h' re.sub('[0-9]+', "|", 'a1b2c3d4e5f6g7', count=2) # 'a|b|c3d4e5f6g7' #正则表达式里使用"\"作为转义字符 #正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d ''' re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同) M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图) S(DOTALL): 点任意匹配模式,改变'.'的行为 '''
\视图代码 # 在线正则表达式测试:tool.oschina.net/regex/# import re \re模块 re.compile、re.match、 re.search :推荐使用 re.match 正则匹配的时候,第一个字符是 r,表示 raw string 原生字符,意在声明字符串中间的特殊字符不用转义。 比如表示 ‘\n',可以写 r'\n',或者不适用原生字符 ‘\n'。 \re.compile() 函数 编译正则表达式模式,返回一个对象。可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。 # re.compile(pattern, flags=0) # pattern 指定编译时的表达式字符串 # flags 编译标志位,用来修改正则表达式的匹配方式。支持 re.L|re.M 同时匹配 # flags 标志位参数 re.I(re.IGNORECASE) 使匹配对大小写不敏感 re.L(re.LOCAL) 做本地化识别(locale-aware)匹配 re.M(re.MULTILINE) 多行匹配,影响 ^ 和 $ re.S(re.DOTALL) 使 . 匹配包括换行在内的所有字符 re.U(re.UNICODE) 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. re.X(re.VERBOSE)
# 正则表达式 # 通配符 # . 表示与任何一个字符进行匹配 # * 表示与此前的字符匹配0或者多次 # ? 匹配0 或者1 次 限定符 # + 1次 或 多次 # .* 最大匹配 # .*? 最小匹配 # ^ 开头\A $结尾 \Z # \b 单词的边界 \B # \d 十进制数字 \D # \w 任何字母数字 \W # \s 任何空格字符(空格、tab、换行。。。) \S #方法: #re.compile(strPattern[, flag]): """ re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同) M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图) S(DOTALL): 点任意匹配模式,改变'.'的行为 L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定 U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性 X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的: """ m = re.match(r'(\w+) (\w+)(?P<sign>.*)', 'hello world!') print("m.string:", m.string) print("m.re:", m.re) print("m.pos:", m.pos) print("m.endpos:", m.endpos) print("m.lastindex:", m.lastindex) print("m.lastgroup:", m.lastgroup) #group([group1, …]):
下图列出了Python支持的正则表达式元字符和语法: 1.2. 数量词的贪婪模式与非贪婪模式 正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。 1.3. 反斜杠的困扰 与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。 1.4. 匹配模式 正则表达式提供了一些可用的匹配模式,比如忽略大小写、多行匹配等,这部分内容将在Pattern类的工厂方法re.compile(pattern[, flags])中一起介绍。 2. re模块 2.1. 开始使用re Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。 代码如下: re.compile(strPattern[, flag]): 这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。 可选值有: re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同) M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图) S(DOTALL): 点任意匹配模式,改变'.'的行为 L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定 U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性 X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的: 代码如下: re提供了众多模块方法用于完成正则表达式的功能。这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行re.compile()代码,但同时也无法复用编译后的Pattern对象。这些方法将在Pattern类的实例方法部分一起介绍。如上面这个例子可以简写为: re模块还提供了一个方法escape(string),用于将string中的正则表达式元字符如*/+/?等之前加上转义符再返回,在需要大量匹配元字符时有那么一点用。 2.2. Match Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。 属性: string: 匹配时使用的文本。 re: 匹配时使用的Pattern对象。 pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。 endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。