python-正则表达式
一、正则表达式
regular expression -----regex 验证匹配
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
方法:
match() 匹配 从头进行匹配 匹配不成功则返回None
fullmatch() 从头到尾 整个字符串跟pattern进行匹配 匹配不成功则返回None
search() 扫描整个字符串查找匹配正则格式的内容,找到返回Match
Match对象:
match.group() 匹配的内容
match.span() 匹配内容的位置
search: 只要在字符串中找到匹配的则不会继续查找
findall: 查找所有匹配的内容,返回值是一个列表
import re # 通过re模块的compile函数,返回一个pattern对象 pattern = re.compile('abc') # 通过pattern对象:match search findall split... match_obj = pattern.match('abcsdfszzabc') print(match_obj) # 匹配对象调用group获取匹配的内容 g = match_obj.group() print(g) a = re.match('123a','123A3454365123A',re.I) print(a) b = a.group() print(b) a = re.fullmatch('aaa','AAA',re.I) print(a) b = re.search('abc','asdabcwrfsd',re.I) print(b) print(match_obj.group()) # 匹配的内容被取出来 print(b.span()) # 匹配内容的位置
字符 功能
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_(下划线)
\W 匹配非单词字符
* 配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
import re s = 'asfghjdfghaxxyxbswabrjrtwegdasazzb' m_obj = re.search('a[xyz]*b', s) if m_obj: print(m_obj.group()) else: print('没有找到') # 两头是数字,中间是字母 s = '1asd23sad4' a = re.search('\d[a-z]+\d', s) if a: print(a.group()) else: print('没有找到') result = re.findall('\d[a-z]+\d', s) print(result) # ['1asd2', '3sad4'] # 验证qq号码 qq = input('请输入你的qq号码:') a = re.fullmatch('[1-9]\d{5,10}', qq) print(a) # 方式二 qq = input('请输入你的qq号码:') a = re.search('^[1-9]\d{5,10}$', qq) print(a)
注:在写正则表达式要在前面添加'r', raw
正则的替换:
sub 替换
sub(pattern,repl,str)
repl:可以str类型也可以是callable类型
s = 'sa sadfa sadf sad' a = re.sub(r'\s+', '#', s) print(a) s = 'xiaohua =20, xiaoming = 18 xiaofang = 21' def change(mobj): print(mobj) content = mobj.group() result = str(int(content) + 1) return result a = re.sub(r'\d+', change, s) print(a)
例子:
import re username = input('请输入用户名:') a = re.fullmatch('[a-zA-Z]\w{5,}',username) if a: print(a.group()) else: print('没有找到!!!') num1 = input('请输入手机号:') a = re.fullmatch('(13|15|18)\d{9}',num1) # 1[358]\d{9} if a: print(a.group()) else: print('没有找到!!!') num1 = input('请输入手机号:') a = re.fullmatch('(\d{3}|\d{4})-\d{8}',num1) # \d{3,4} - \d{8} if a: print('合法!!!') else: print('没有找到!!!') num1 = 'I am a good boy , a handsome boy' a = re.findall(r'\b[a-z]+\b',num1,re.I) # print(a)
贪婪与非贪婪:
''' 贪婪与非贪婪: ''' s = 'abbbbbbbbbbbbbc' a = re.match('ab+?',s) print(a.group()) s = '<div>hello</div><div>world</div>' a = re.match(r'<(?P<n>.+)>.+?</(?P=n)>',s) print(a.group())
import re s = 'hello jack,hello tom' a = re.findall('(hello|hi) (jack|tom)',s,re.I) print(a[1][1]) print(a) # 邮箱:126,163,qq 而且必须符合邮箱的格式 email = input('请输入邮箱:') a = re.search(r'^(\w{4,10})@(126|163|qq).com$',email) if a: b = email_name = a.group(1) print('合法!!!',b) else: print('不合法!!!') # 1开头,不是以4、7结尾的手机号码(11位) 或者 010-34567897|0311-37647326 phone = input('请输入手机号或座机:') a = re.search(r'(1\d{9}[0-35689])|(\d{3,4}-\d{8})',phone) if a: print('合法!!!',phone) else: print('不合法!!!')
二、进程、线程
import time from multiprocessing import Process def program(): for i in range(5): print('写代码%d行'%i) time.sleep(1) def listen_music(): musics = ['逆战','凉凉','麻婆豆腐','无地自容'] for music in musics: print('正在听:{}歌'.format(music)) time.sleep(1) def weichat(user): name = '詹姆斯' for i in range(5): print('{}正在和{}聊天!!'.format(user,name)) time.sleep(1) if __name__ =='__main__': p1 = Process(target=program,name='进程1') p2 = Process(target=listen_music,name='进程2') # p3 = Process(target=weichat,args=['gang']) p3 = Process(target=weichat,name='进程3',kwargs={'user':'gang'}) p1.start() p2.start() p3.start()