Python 使用正则表达式

可以用于 判断用户的输入是否符合要求;或者 在使用爬虫时 匹配资源的网址

re 模块

在Python中使用 正则表达式 需要 使用 re 模块

import re
result = re.match(正则表达式,要匹配的字符串)	
match默认从头匹配

提取数据 
result.group()

匹配单个字符

匹配一个数字: \d ,就是 0 - 9

re.math(r"变形金刚\d","变形金刚3")

匹配一组里的任意一个 : [ 12345 ] ,[ 123-8abc-g ]
在中括号里可以 是 数字或字母 (可以大小写)

一段连续的 : [ 1-5 ]
不连续的可以 分别输入 [ 136 ]
有段连续,有段不连续 : [ 1-36-9 ]

re.math(r"变形金刚[1-36-9]","变形金刚7")

还有反向字符集匹配: [^123] 或 [^1-3]
匹配 不是 123 的任何其他字符;或 匹配不在 1-3范围内的任意其他字符。

匹配任意一个字符: . 点号 ;除了换行符 \n

匹配非数字 : \D
匹配空白 : \s ,就是 空格 ,tab键
匹配非空白 : \S
匹配单词字符: \w ,包括 a-z,A-Z,0-9,_
匹配非单词字符: \W

匹配多个字符

{n} 或 {m,n}
紧跟在 {} 前的那个字符 必须有n 个字符,或 可以有 m 到 n 的任意多个。
需要满足 前面那个字符的要求,例如 \d{11} ,就需要输入 11 位数字。


紧跟在?前的那个字符 ,可以有也可以没有,一次或0次

re.match(r"\d{3,4}-?\d{7,8}") 
匹配电话号码   021-1234567,或  0213-12345678

*
前面的一个字符可以 重复任意次,可以没有

+
前面的一个字符可以 出现一次或多次,必须出现一次

^
匹配字符串开头,
当这个字符,没有出现在 正则表达式的首位时,只表示 普通字符 ^

$
匹配字符串结尾
在末尾加上 $ , 表示需要匹配到字符串的末尾才算匹配成功

如果要匹配的字符串 用到了 特殊字符,比如 . ? + 等 . , 那么需要用 转义字符 \ 给修饰一下

分组

()
分组的作用,把整个字符串,可以分为单独的块,之后可以单独取出来。
用 group(1) ,可以取出 第一个() 里的内容

如果前面匹配的内容,在后面也有相同的要匹配,可以把前面的用()括起来,在后面用 \第几个括号 \1 或 \2 ,来引用前面匹配的值。

re.match(r" <(\w*)>.* ")

分组 还可以 起别名 (?P<别名> 内容) ,引用时 ( ?P=别名 )

|
类似于 或 ,
(162 | 163 | 137) 就是可有匹配三个中的任意一个

Python 里的高级用法

search
不从头开始,只要匹配到第一个满足的 就返回

例如匹配出文章的阅读次数
re.search(r"\d+","阅读次数为:9999").group()      //   9999

findall
不从头开始,把所有满足的都匹配出来 并返回

例如 统计出Python,Scala 相应文章的阅读次数
re.findall(r"\d+","python : 9999, scala : 9996").group()         //   ['9999','9996']

sub
把匹配到的字符 换为 给定的字符

例如 
re.sub(r"\d+","998","python = 996")      // python = 998    ,不用group() ,会直接返回
还可以调用函数
def add(temp):
	strNum = temp.group()
	num = int(strNum) + 1
	return str(num)
re.sub(r"\d+", add ,"python = 996")            // python = 998

split
根据匹配进行切割字符串,返回一个列表

根据 空格 或 : 分割
re.split(r": | ","info:scala 3")              //  会直接返回    ['info','scala','3']

你可能感兴趣的:(Python,正则表达式)