Python--正则表达式01

1.re模块

需要先导入re模块

import re

使用正则表达式:
有两种函数
re.compile():

demo1 = re.compile('[0-9]+?')
demo2 = re.compile('^[0-9]+?$')
test1 = demo1.findall(strs) # strs为要查找的字符串
test2 = demo2.findall(strs) 

re.match(参数一,参数2)
参数一:正则表达式
参数二:所要使用的字符串

demo3 = re.match('[0-9]+?', strs)
demo4 = re.match('^[0-9]+?$', strs)
  • demo1和demo2的唯一差距就是 ^ 与 $,^代表起始位置,$代表结束位置
    举例说明:
strs = '123456abc'
demo5 = re.compile('^[0-9]+') 
demo6 = re.compile('[0-9]+$') 
demo7 = re.compile('^[0-9]+$')
demo8 = re.compile('^[0-9]+abc$')

demo5:^ 会检查第一个字符是否为数字,符合了则返回数字,不符合则返回空
demo6:$ 会检查最后一个字符是否为数字,符合则返回数字,不符合则返回空
demo7:首尾都加了^与$,则会检查整个字符是否完全符合正则表达式,是则返回匹配数据,不是则返回空
结果:

# demo5
123456
# demo6
''
# demo7
''
# demo8
123456abc
  • 一个正则表达式由三个阶段组成 [0-9]+?
    [0-9]:所要选取的数据范围
    +:要取多少个,+号表示取一个(只有一个的话)或多个(多个且连续)
    ?:使用什么模式 默认是贪婪模式,加了?之后会变为非贪婪模式

2.正则的相关参数 第一个部分

2.1 提取数字\d与 提取非数字\D

举例:字符串strs = ‘123123 asdf rrr \n 123’
贪婪模式取数

demo = re.compile('\d+')

结果:

['123123', '123'] # 此处为贪婪模式

非贪婪模式取数

demo = re.compile('\d+?')
last = demo.findall(strs)

结果:

	['1', '2', '3', '1', '2', '3', '1', '2', '3'] # 非贪婪模式

取非数字:

demo = re.compile('\D+')

2.2 提取数字,字母,下划线和汉字\w,反向提取\W

strs = '123123 asdf rrr \n 123'
demo = re.compile('\w+')
last = demo.findall(strs)

结果:

['123123', 'asdf', 'rrr', '123']
# \n是换行字符

2.3 提取空白字符 \s

strs = '123123 asdf rrr \n 123'
demo = re.compile('\s+')
last = demo.findall(strs)
print(last)

结果:

[' ', ' ', ' \n ']

2.4 使用自己指定的规则 []

举例:
1.匹配字母a-z,大写字母A-Z,下划线_

demo = re.compile('[a-zA-z_]+')

2.匹配数字

demo = re.compile['[0-9]+']

3.匹配中文字符
提取中文:\u4E00-\u9FA5

demo = re.compile('[\u4E00-\u9FA5]+')

4.匹配[]内选中以外的其他字符
^[]里可以反向取值
选取出除小写字母a-z,大写字母A-Z,下划线_,空格\s,中文\u4E00-\u9FA5的其他字符

demo = re.compile('[^a-zA-Z0-9_\s\u4E00-\u9FA5]+')

2.5 匹配所有元素 .

strs = '123123 asdf rrr \n 123'
deom = re.compile('.+')

结果:
其中换行符\n没有囊括进来,要想包括则需要在re.compile加上一个参数

['123123 asdf rrr ', ' 123']
deom = re.compile('.+', re.S)  # 将换行符转变为正常字符

3.正则的相关参数 第二个部分

本部分都是用字符串strs

strs = '123123 asdf rrr \n 123'

3.1 + (常用)

+号代表:
只有一个数字(提取一个)
有多个数字(提取多个,一直取到没有数字为止)

 demo = re.compile('\d+')
 last = demo.findall(strs)

结果:

['123123', '123']

3.2 * 代表0个或多个

不是选取范围内的字符,用' '代替

demo = re.compile('\d*')

结果:

['123123', '', '', '', '', '', '', '', '', '', '', '', '', '123', '']

3.3 {} 自定义选中的范围

举例一:
提取的数字只有范围大于等于2,小于等于4才能被选取

demo = re.compile('\d{2,4}')

结果:

['1231', '23', '123']

举例二:
提取的数字只有范围大于等于2 才能被选取

demo = re.compile('\d{2,}')

结果:

['123123', '123']

举例三:
按两个字符来选取

demo = re.compile('\d{2}')

结果:

['12', '31', '23', '12']

4.正则的相关参数 第三个部分

设定正则表达式所使用的模式,有贪婪模式和非贪婪模式
默认为贪婪模式

4.1 设定非贪婪模式 ?

demo = re.compile('\d+?')

贪婪模式与非贪婪模式差别:

demo1 = re.compile('\d+')
demo2 = re.compile('\d+?')

结果:
demo1
贪婪模式

['123123', '123']

demo2
非贪婪模式

['1', '2', '3', '1', '2', '3', '1', '2', '3']

5.()关键字

加入()之后,正则表达式只会显示出()里要求显示的字符,其他字符作为找到该字符的参照物
举例:

strs = '1231234 asdf rrr \n 123'

显示出234 和 rrr之间的数据:

demo = re.compile('234([a-z ]+)rrr')

结果:

[' asdf ']

6.| 或符号

A|B可以匹配A或B,所以(P|p)ython可以匹配’Python’或者’python’。
若前者匹配到了,则后者返回’‘空
若后者匹配到了,则前者返回’'空

strs = '1231234 asdf rrr \n 123'

使用或匹配,若前者符合则返回[a-z ]+
若后者符合,则返回(. *),代表选择所有字符

demo1 = re.compile('234([a-z ]+)rrr| rr(.*)123', re.S)
demo2 = re.compile('23([a-z ]+)rrr| rr(.*)123', re.S)

前者符合结果:

# demo1
[(' asdf ', '')]

后者符合结果:

# demo2
[('', 'r \n ')]

测试题

测试题一 :查找Email名字

def name_of_email(addr):
    demo1 = re.compile('(<([0-9a-zA-Z. ]+)>.*?@\w+\.org)|(([0-9a-zA-Z.]+)@\w+\.org)')    #  (()|()) 显示出来会有四个值
    # 第一个值(<([0-9a-zA-Z. ]+)>.*?@\w+\.org) 这一个符合的整体
    # 第二个值  <([0-9a-zA-Z. ]+)>.*?@\w+\.org 只显示括号里的数据,其他的为方便参考
    # 第三个值 (([0-9a-zA-Z.]+)@\w+\.org) 这一个符合的整体
    # 第四个值 ([0-9a-zA-Z.]+)@\w+\.org 只显示括号里的数据,其他方便参考
    demo = re.compile('<([0-9a-zA-Z. ]+)>.*?@\w+\.org|([0-9a-zA-Z.]+)@\w+\.org')
    # 若前者符合,则后者为空
    # 若后者符合,则前者为空
    last = demo.findall(addr)
    print(last)
    if last[0][0] == '':
        return last[0][1]
    else:
        return last[0][0]

测试:

# 测试:
assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print(name_of_email('<Tom Paris> tom@voyager.org'))
print('ok')

测试题二 :检查是否是Email

 def is_valid_email(addr):
     demo = re.compile(r'[0-9a-zA-Z.]+@\w+.com')
     # 在字符串前加r,可以忽略转义字符
     last1 = demo.match(addr)
     print(last1)
     return last1

测试:

assert is_valid_email('someone@gmail.com')
assert is_valid_email('bill.gates@microsoft.com')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('mr-bob@example.com')
print('ok')
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值