python之正则表达式

单个字符匹配

findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回
预定义字符集

.              匹配任意字符,除了换行符\n
\d           匹配数字
\D          匹配非数字
\w          匹配字母或数字或下划线     (正则函数中,支持中文的匹配)
\W         匹配非字母或数字或下划线
\s           匹配任意的空白符
\S          匹配任意非空白符
\n          匹配一个换行符
\t           匹配一个制表符
[]           字符组,必须从字符组列举出来的字符当中抽取,默认一个,如 果没有返回空
^    表示除了 , 在字符组当中,开头的位置使用
例: print(re.findall('a[^-+*/]b',"a%b ccaa*bda&bd")) #a%b a&b
如果想要匹配^ - 需要前面加上\进行转义
lst = re.findall("a[\^\-]b","a+b a-b a^b")
print(lst) # ['a-b', 'a^b'] 
 匹配 \
\b 本身也是转义字符 : 退格(把光标向左移动一位)
lst = re.findall(r"a\\b",r"a\b")
print(lst[0]) 

多个字符的匹配

量词

? 匹配0个或者1个a 
+ 匹配1个或者多个a
* 匹配0个或者多个a
{m,n} 匹配m个至n个

贪婪匹配和非贪婪匹配

贪婪匹配 :   默认向更多次数匹配(回溯算法)
非贪婪匹配 : 默认向更少次数匹配    在量词的后面接? (.??  .+?  .*?  {4,}?)
回溯算法 : 从左向右进行匹配,直到匹配到最后,再也找不到了,回头,找最后一个(递归)
** 边界符 \b**
\b 本身也是转义字符 : 退格(把光标向左移动一位)
例: word
右边界: d\b
左边界: \bw
  #  ^ $  
^ 匹配字符串的开始(必须以... 开头)
$ 匹配字符串的结尾(必须以... 结尾)
当使用^ 和 $ 符号的时候,要把字符串看成整体

匹配分组

正常情况下用()圆括号进行分组 可以用\1 反向引用第一个圆括号匹配的内容
() 优先显示括号里面的内容
?: 取消显示括号里面的内容
| 代表或 , a|b 匹配字符a 或者 匹配字符b . 把字符串长的写在前面,字符串短的写在后面

findall 是把所有符合条件的内容都匹配出来放到列表里
	    不能够把匹配到的结果和分组当中的内容显示在同一个界面当中

search  按照正则表达式,把第一次匹配到的内容返回出来,返回的是对象
		能够把匹配到的结果和分组当中的内容显示在同一个界面当中
		
对象.group   返回的是匹配到的结果
对象.groups  返回的是括号分组里面的内容

如果匹配不到内容,返回的是None ,无法调用group 或者groups方法的
# search 的用法
strvar = "www.baidu.com www.lagou.com www.oldboy.com"
obj = re.search(r"(www).(baidu|oldboy).(com)",strvar)

# 返回的是匹配到的结果
res = obj.group()
print(res)

# 通过group和下标可以获取到括号的内容(了解)
print(obj.group(1))
print(obj.group(2))

# 返回的是括号分组里面的内容
res = obj.groups()
print(res)

命名分组

1.反向引用 : 把匹配到的值,再引用一次
\1 代表反向引用第一个括号内容 \2代表反向引用第二个括号内容
2.命名分组
(?P<组名>正则表达式) 给这个组起一个名字
(?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置

# 方法一
strvar = "a1b2cab"
obj = re.search(r"(?P.*?)\d(?P.*?)\d(?P.*?)\1\2",strvar)
# 获取匹配到的内容
res1 = obj.group()
print(res1)
# 获取分组里面的内容
res2 = obj.groups()
print(res2)

# 方法二
strvar = "a1b2cab"
obj = re.search(r"(?P.*?)\d(?P.*?)\d(?P.*?)(?P=tag1)(?P=tag2)",strvar)
# 获取匹配到的内容
res1 = obj.group()
print(res1)
# 获取分组里面的内容
res2 = obj.groups()
print(res2)

正则函数

search 通过正则匹配出第一个对象返回,通过group取出对象中的值

strvar = "1+2 3*4"
obj = re.search("\d+(.*?)\d+",strvar)
print(obj)
# 返回匹配到的内容(匹配到一个就返回)
res = obj.group()
print(res)
# 返回分组里面的内容,类型是元组
tup = obj.groups()
print(tup[0])

match 验证用户输入内容(了解)当search函数里面的正则表达式前面加上^ 等价于 math的用法

 split    切割
strvar = "alex|xboyww&wusir%ritian"
res = re.split("[|&%]",strvar)
print(res)

 sub      替换 
"""sub(正则,要替换的字符,原字符串[,次数])"""
strvar = "alex|xboyww&wusir%ritian"
res = re.sub("[|&%]","-",strvar)
print(res)
strvar = "alex|xboyww&wusir%ritian"
res = re.sub("[|&%]","-",strvar,2)
print(res)
subn     替换 (用法和sub一样,区别在于返回的是元组 (结果,次数)  )
strvar = "alex|xboyww&wusir%ritian"
res = re.subn("[|&%]","-",strvar)
res = re.subn("[|&%]","-",strvar,1)
print(res)
finditer 匹配字符串中相应内容,返回迭代器[迭代器中包含的是对象]
from collections import Iterator , Iterable
strvar = "jkasdfjkadfjk1234asfj2342kfa"
it = re.finditer("\d+",strvar)
print(isinstance(it,Iterator))
compile  指定一个统一的匹配规则
正常情况下,正则表达式编译一次,执行一次.
如果想要编译一次,多次使用的话,使用compile

compile 可以编译一次,终身受益.节省系统的资源
strvar = "jksdjdfsj72343789asdfaj234"
pattern = re.compile("\d+")
print(pattern)
lst = pattern.findall(strvar)
print(lst)
obj = pattern.search(strvar)
print(obj.group())

正则表达式修饰符

re.I 使匹配对大小写不敏感

strvar = "

72347923489

" pattern = re.compile(r"

(.*?)

",flags=re.I) obj = pattern.search(strvar) print(obj) print(obj.group())

re.M 使每一行都能够单独匹配(多行),影响 ^ 和 $

strvar = """

72347923489

72347923489

  • 72347923489
  • """ pattern = re.compile("^<.*?>(?:.*?)<.*?>$",flags=re.M) lst = pattern.findall(strvar) print(lst)

    re.S 使 . 匹配包括换行在内的所有字符

    strar = """give
    1234234234mefive
    """
    pattern = re.compile("(.*?)mefive",flags=re.S)
    obj = pattern.search(strar)
    print(obj)
    print(obj.group())
    

    你可能感兴趣的:(python)