import re
1,站长之家正则表达式
http://tool.chinaz.com/regex
2.什么是正则表达式
一套规则,匹配字符串的,只能操作字符串
#能做什么
1,检测一个输入的字符串是否合法
2.从一个大文件中找到所有复核规则的内容
字符组[]
一个中括号只匹配一个字符位置
[0-9]根据ascii进行范围进行匹配
[a-z]
[A-Z]
[a-zA-Z]大小写
[0-9a-z]
[0-9a-z-A-Z_] 数字字母下划线,但是比较麻烦
#####
在正则表达式中能够帮助我们表示匹配的内容的符号都是正则中的元字符
[0-9] -> \d 表示匹配一位任意数字 digit
0-9a-z-A-Z_] 数字字母下划线,但是比较麻烦可以用 \w 表示 word
空白(空格/tab/enter/)--》( /\t/\n) \s统一代替
空格 --> 后面这里有空格,看不见而已
tab --> \t
enter --> \n
空格,tab和回车---》 \s 代替
\W 非数字字母下划线
\D 只要不是数字,就能匹配上
\S 非空白
[\d\D] [\w\W] [\s\S]匹配所有
. 匹配除了换行符之外的所有
但是想用.匹配换行符,可以设置一下,flags=re.S
匹配html文件中(.*?)用的比较多
[^] 非
[^\d] 匹配所有的非数字
^ 匹配一个字符串的开始
$ 匹配一个字符串的结尾
a表达式|b表达式 匹配a表达式或b表达式的内容,如果匹配a成功了,就不会跟b匹配了
,如果两个规则有重叠部分,总是把长的放到前面
www\.oldboy\.com|www\.jd\.com
www\.(oldboy|jd)\.com
() 约束|描述的内容的范围问题
#####量词
{n} 表示匹配n次 \d{2} 匹配一个2位数
{n,} 表示匹配至少n次
{n,m} 表示至少匹配n次,至多m次
? 表示匹配0次或1次 {0,1}
+ 表示匹配1次或多次 {1,}
* 表示0次或多次 {0,}
匹配整数或小数
\d+(\.\d+)?
11位手机号码
^1[3-9]\d{9}$
从大文件中找复核规则的内容
就不加^跟$了
####
.*?x 匹配任意内容任意次数,遇到x就停下来
.+?x 匹配任意内容至少1次,遇到x就停下来
贪婪匹配:
在量词范围内,尽量多匹配
在量词范围允许的情况下,尽量多的匹配内容
.*x 表示匹配任意字符,任意多次数,但是遇到最后一个x才
停下来
贪心算法/回溯算法
\d{3,}6
非贪婪(惰性匹配)
在量词范围内,尽量少匹配
\d{3,}?6
.*?x 表示匹配任意字符,任意多次数,但是一遇到x就停下来
###转义符
1原本有特殊意义的字符,到了表达它本身的意义的时候,需要转义
2.有一些有特殊意义的内容,放在字符组中,会取消它的特殊意义
[().*+?] 没有特殊意义了
[a\-c] \ 是有特殊意义的
Import re
findall 还是按照完整的正则进行匹配,总是只显示括号里匹配到的内容
ret=re.findall('9(\d)\d',ssjkjk188)
findall 把所有匹配的都拿出来,返回列表
ret=re.search 取一个匹配的,返回的是一个变量,如果空的话会报错,需要
判断一下 ,用ret.group()
print(ret)
if ret:
print(ret.group())
print(ret.group(1))
ret=re.search('9(\d)\d',ssjkjk188)
findall 取所有符号条件的,优先显示分组中的
search 只取第一个符合条件的,没有优先显示这件事儿
searchh 还是按照完整的正则进行匹配,显示也显示匹配到
的第一个内容,但是我们可以通过给group方法传参数,来获取具体分组中的内容
search 得到的结果是一个变量,变量.group的结果完全和变量.group(0)的结果一致
。可以通过变量.group(n)的形式来指定获取第n个分组中匹配到的内容
1为什么要用分组:
把想要的内容放分组里
2.如何取消分组优先
如果在写正则的时候由于不得已的原因导致不要的内容也得写在分组里
(?:)取消这个分组的优先显示
split
sub
subn
match
compile :节省代码时间的工具
假如同一个正则表达式要被多次使用
节省了多次解析同一个正则表达式的时间
ret=re.compile('\d+')
ret.search('alex2789')
ret.findall('alex2789')
finditer:节省空间
### 给分组命名
(?P<name>\d+)
分组命名的引用
<(?P<tag>\w)>.*?</(?P=tag)>
print(ret.group('name'))
.任意一个字符,不能是\n,普通模式、多行模式、single line 、dot all,\n也能匹配
普通模式:就是一个长长的字符串
多行模式:普通模式改成以\n为换行符的多行文本,只影响^$
单行模式:dot(点.) all,一穿到底
^永远指的是行首
$永远指的是行尾