正则表达式匹配规则:

匹配单个字符:

1.匹配某个字符
text = 'hello'
ret = re.match('he',text)
print(ret) # 输出结果 <re.Match object; span=(0, 2), match='he'>
print(ret.group()) # 输出结果:he
2. 点(.):匹配除换行符外的任意字符
text = 'hello'
ret = re.match('.',text)
print(ret) # 输出结果 <re.Match object; span=(0, 1), match='h'>
3.1 \d:匹配任意数字(0-9)
text = '298'
ret = re.match('\d',text)
print(ret) # 输出结果 <re.Match object; span=(0, 1), match='2'>

 

3.2 \D:匹配任意的非数字
text = '2'
ret = re.match('\D',text)
print(ret) # 输出结果 None

text = 'a'
ret = re.match('\D',text)
print(ret) # 输出结果 <re.Match object; span=(0, 1), match='a'
 4.1 \w: 匹配a-z,A-Z以及数字和下划线
text = 'a_298'
ret = re.match('\w',text)
print(ret) # 输出结果 <re.Match object; span=(0, 1), match='a'>

# 如果匹配一个其他字符,那么就匹配不到。
text = '+'
ret = re.match('\w',text)
print(ret) # 输出结果 None
4.2 \W:匹配的是和\w相反的,即:\w匹配不到的\W能匹配到
text = '+'
ret = re.match('\W',text)
print(ret) # 输出结果 <re.Match object; span=(0, 1), match='+'>


text = 'a_298'
ret = re.match('\W',text)
print(ret) # 输出结果 None
5. \s:匹配空白字符串(\n,\t,\r,空格)
text = '\n'
ret = re.match('\s',text)
print(ret) # 输出结果<re.Match object; span=(0, 1), match='\n'>
6.[]组合的方式进行匹配,只要满足中括号中的某一项都算匹配成功
text = '0371-888adaes'
ret = re.match('[\d\-]+',text)
print(ret) # 输出结果<re.Match object; span=(0, 8), match='0371-888'>
print(ret.group())  # 输出结果:0371-888
# 6.1 []代替\d
text = '0371'
ret = re.match('[0-9]',text)
print(ret.group())  # 输出结果:0

# 6.2 []代替\D
text = '0371'
ret = re.match('[^0-9]',text)
print(ret.group())  # 输出结果:'NoneType' object has no attribute 'group'


# 6.3 []代替\w
text = '_'
ret = re.match('[a-zA-Z0-9_]',text)
print(ret.group())  # 输出结果:_

# 6.4 []代替\W
text = '0'
ret = re.match('[^a-zA-Z0-9_]',text)
print(ret.group())  # 输出结果:'NoneType' object has no attribute 'group'


text = '+'
ret = re.match('[^a-zA-Z0-9_]',text)
print(ret.group()) # 输出结果:+
View Code

匹配多个字符

1. * :可以匹配0或者任意多个字符
text = '037'
ret = re.match('\d*',text)
print(ret.group()) # 输出结果:037
2. + : 可以匹配一个或者多个字符,最少一个。>=1
text = '037'
ret = re.match('\d+',text)
print(ret.group()) # 输出结果:037

text = ''
ret = re.match('\d+',text)
print(ret.group()) # 输出结果:'NoneType' object has no attribute 'group'
3. ? : 匹配一个或者0个
text = 'abcd'
ret = re.match('\w?',text)
print(ret.group()) # 输出结果:a
4. {m} : 匹配m个字符
text = 'abcd'
ret = re.match('\w{2}',text)
print(ret.group()) # 输出结果:ab
5. {m,n} : 匹配m-n个字符,字符串足够长时,输出n个字符串。
text = 'abcdfgd'
ret = re.match('\w{1,5}',text)
print(ret.group()) # 输出结果:abcdf

特殊符号

^(脱字号):表示以...开始。如果在[]中表示取反操作
text = "hello"
ret = re.match('^h',text)
print(ret.group()) #  输出结果:h
$: 表示以...结束
text = "xxx@163.com"
ret = re.match('\w+@163\.com$',text)
print(ret.group()) #  输出结果:xxx@163.com
|: 匹配多个表达式或者字符串
text = "hello|word"
ret = re.match('hello',text)
print(ret.group()) #  输出结果:hello
# 验证手机号码:手机号的规则是:1开头,第二位可以是34578,后面九位随意。
# text = '13566666666'
# ret = re.match('1[34578]\d{9}',text)
# print(ret.group())
验证手机号码
# 验证邮箱:邮箱的规则是邮箱名是用数字、字母、下划线组成的,然后是@符合,后面是域名。
# text = 'henan12@163.com'
# ret = re.match('\w+@\w+\.[a-z]+',text)
# print(ret.group())
验证邮箱
# 验证URL
# text = "https://baike.baidu.com/item/Python/407313?fr=aladdin"
# ret = re.match('(http|https|frp)://[^\s]+',text)
# print(ret.group())
验证URL
# 验证身份证
# text = "15555555555584996X"
# ret = re.match('\d{17}[\dxX]',text)
# print(ret.group())
验证身份证

 

 

贪婪模式和非贪婪模式:

贪婪模式:正则表达式会匹配尽量多的字符。默认是贪婪匹配。
非贪婪匹配:正则表达式会尽量少的匹配字符。
# 贪婪匹配
text = "15577849"
ret = re.match('\d+',text)
print(ret.group())  #  输出结果:15577849


# 非贪婪匹配
text = "15577849"
ret = re.match('\d+?',text)
print(ret.group())  #  输出结果:1

 

转义字符和原生字符

在正则表达式中,有些字符具有特殊含义,如果要匹配这些字符,就必须使用反斜杠"\"进行转义。
比如$代表的是以...结尾,如果要匹配$,就必须使用\$。

# match 遍历一个字符,search遍历整个字符串
text = "app price is $88"
ret = re.search('\$(\d+)',text)
print(ret.group())  #  输出结果:$88

原生字符:在正则表达式中,\是专门用来转义的。在python中\也是用来做转义的。因此,如果想要在普通的字符串中匹配出\,那么要给出四个\。

text = "app \c"
ret = re.search('\\\\c',text)
print(ret.group())  #  输出结果:\c

#使用原生字符串
text = "app \c"
ret = re.search(r'\\c',text)
print(ret.group())  #  输出结果:\c

 

python中re模块的常用函数

match:

从开始的位置进行匹配,如果开始的位置没有配到,那么就失败。

search:

在整个字符串中查找字符。如果找到,就返回查找到的第一个满足条件的字符;如果没有找到,就失败。

 

分组:

在正则表达式中,可以对过滤到的字符串进行分组。分组使用()。

1. group():与group(0)等价,返回的是符合整个满足条件的字符串。

2. groups: 返回的是里面的子组。索引从1开始。

3. group(1): 返回的是第一个子组,可以传入多个。

 

text = "app price is $88,book price is $20"
ret = re.search(r'.*(\$\d+).*(\$\d+)',text)
print(ret.group())  #  输出结果:app price is $88,book price is $20
print(ret.group(0))  #  输出结果:app price is $88,book price is $20
print(ret.groups())  #  输出结果:('$88', '$20')
print(ret.group(2))  #  输出结果:$20

findall:

找出所有满足条件的,返回的是一个列表。

text = "app price is $88,book price is $20"
ret = re.findall('\$\d+',text)
print(ret)  # 输出结果:['$88', '$20']

 

sub:

用来替换字符串,将匹配到的字符串使用指定的字符串替换掉。

text = "app price is $88,book price is $20"
ret = re.sub('\$\d+','5',text)
print(ret)  # 输出结果:app price is 5,book price is 5

 

split:

使用正则表达式分割字符串。

text = "hellow&world you hao"
ret = re.split('[^a-zA-Z]',text)
print(ret)  # 输出结果:['hellow', 'world', 'you', 'hao']

 

compile:

对于一些经常用到的正则表达式,可以使用complie进行编译,后期使用时直接拿去使用,这样执行效率更快。

而complie可以指定 "flag=re.VERBOSE  "。在写正则表达式时最好做好注释。

text = "the nimber is 20.65"
r= re.compile(r"""
            \d+ #小数点前面的数字
            \.? #小数点本身
            \d* #小数点后面的数字
""",re.VERBOSE)
ret = re.search(r,text)
print(ret.group())# 输出结果:20.65

 

posted on 2020-10-27 15:35  -豪-  阅读(180)  评论(0编辑  收藏  举报