复习正则表达式20190618

python中的正则表达式大致分为以下几个部分:

1、元字符

2、模式

3、函数

4、re 内置对象用法

5、分组用法

6、环视用法

Python处理正则表达式的模块是re模块

一、元字符

    一般字符(匹配自身)

       匹配任意字符(不包括换行符),在DOTALL模式下可以匹配换行符

\         转义一个特殊的字符,是这个字符表示原来字面上的意思。如\\.匹配.

    预定义字符集

[...]     匹配括号中出现的任意单个字符

[^...]   不批括号中列出的单个字符(注意只能针对单个字符)

\d        匹配任意一个数字,范围为[0-9]

\D        匹配任意一个非数字,等价于[^0-9]

\s         匹配任意一个空白字符:[<空格>\t\r\n\v\f]

\S        匹配任意一个非空白字符,等价于[^\s]

\w        匹配任意一个字母、数字、下划线

\W       不匹配任意一个字母、数字、下划线,等价于[^\w]

    数量字符集

^        匹配开始位置,多行模式下匹配每一行的开始

$        匹配结束位置,多行模式匹配每一行的结束

*         匹配0次1次或多次

+        匹配1次或多次

      匹配0到1次

{m}     匹配前一个字符m次

{m,n}  匹配前一个字符m到n次

{m,}    匹配前一个字符最少m次

{,n}     匹配前一个字符0到n次,最多n次

\A       仅匹配字符串的开始

\Z        仅匹配字符串的结束,如果存在换行,只匹配到换行之前的前的结束字符

\b        匹配一个单词的边界,也就是单词和空格之间的每一行结尾

\B        [^\b]表示匹配非单词边界

|(或)    |或匹配符,表达左右正则表达式任意匹配一个。如果左边的表达式匹配上了,匹配结束,不再                                                             

           匹配右便的表达式。改符号一般放在()中使用,如果没在()中使用则它的范围是整个表达式

分组

(...)      向后引用。用()括起来的正则表达式被作为一个分组,从正则表达式的左边一次算起,右多少         

            个‘(’,就有多少个分组,分组的编码从1 开始一次加1,无论是括号中嵌套括号,并且作为分    

           组表达式作为一个整体,后可接数量词

\<num>  引用分组匹配到的分组编号为<num>的字符串

 

二、模式

    正则表达式的模式是可以同时使用多个的,python里面使用|同时添加多个模式

re.I    忽略大小写匹配模式

re.L   字符集本地化

re.M   多行匹配

re.S    此模式下.可以匹配任意字符,包括换行符

re.U   根据Unicode字符集解析字符。这个标志影响:\w \W \b \B \s \S \d \D

re.X   此模式忽略正则表达式中的空白和#号的注释,常用于匹配邮箱的正则表达式

 

三、函数

 re.complie(pattren,flags=0)

  给定一个正则表达式pattern,制定使用模式flags默认是0,即不适用任何模式

例子:

import re

pattern = re.compile(r"hello")

rege = pattern.match("hello wordld!")

print(rege)

re.match(pattern,string,flags=0)

开始位置匹配,匹配成功,则匹配到了,否则匹配失败

re.search()

任意位置开始匹配,第一次匹配成功了,就不会往下匹配了

re.findall()

匹配整个字符串,匹配成功返回一个列表,匹配失败返回一个空的列表

re.finditer()

与findall一样,不同之处在于findall是返回一个列表,finditer返回一个迭代器

re.split(pattern,string,maxsplit=0,flags=0)

参数maxsplit制定切割次数,函数使用正则表达式寻找字符串的位置,返回切割后的字符串列表,匹配不成功,则返回原字符串列表

re.sub(pattern,repl,string,count=0,flags=0)

替换函数,将正则表达pattern匹配到的字符换替换为repl制定的字符串,参数count指替换的最大次数

 

练习题:

s = 'sunck !  is a good man!'
import re

print(re.split(r" +",s))
print(re.split(r"!",s))
print(s.split())


s1 = 'sunck is a good man!sunck is a nice man!sunck is a handsome man'
d = re.finditer(r"sunck",s1)
while 1:
    try:
        i =next(d)
        print(d)
    except StopIteration as e:
        break

'''

字符串的替换、修改

sub(pattern.repl.string.count = 0,flags = 0)  返回一个被替换h后的字符串

subn(pattern,repl,sting,count = 0.flage = 0)  返回一个元组,第一个被替换后的字符串,第二个是替换的次数

'''

s3 = 'sunck is a good good good man!'
print(re.sub(r"good","nice",s3))

print(re.subn(r"good","nice",s3))

'''
分组group()
'''
s4 = '010-63214569'
m = re.match(r"(\d{3})-(\d{8})",s4)
print(m.group())
print(m.group(1))
print(m.group(2))

 

"""

写一个函数匹配字符串中的5个数字

"""

import re
def test_regular(destine_string):
    result = re.search(r"\D\d{5}\D|^\d{5}\D|\d{5}$|^\d{5}$",destine_string)
    if result:
        word_list=[]
        for s in result.group():
            if s in '0123456789':
                word_list.append(s)
        print("".join(word_list))
        return "".join(word_list)
    else:
        print("NOT find")
        return "NOT find"

if __name__=="__main__":
    test_data = ["12345","avcd12345","12345ww","abc12345qw"]
    for data in test_data:
        #assert test_regular(data) =="12345"
        #assert test_regular('12345')=="12345"
        #assert test_regular('x12345') == "12345"
        #assert test_regular('12345qq') == "12345"
        #assert test_regular('12345') == "12345"
        assert test_regular('vvv12345qq') == "12345"

"""

提取字符串中所有的有效的域名地址

"""

add = 'https://www.net.com.edu//action=?asdfsd and other '
import re
res = re.findall(r"((w{3}\.)(\w+\.)+(com|edu|cn|net))",add1)
print(res)

 

posted @ 2019-06-18 15:40  风声~~  阅读(206)  评论(0编辑  收藏  举报