当前位置:   article > 正文

python基础—正则表达式_python pattern

python pattern

目录

1.正则表达式:☆

1.1 正则写法快速入门:

① 常用正则符号:☆

1.1.1 利用原生字符r“\()”  规则:

② 使用re模块实现正则表达式:

【1】使用match()方法进行匹配:

【1.1】正则表达式的pattern对象 

【1.3】贪婪模式与非贪婪模式 

【2】使用search()方法进行匹配:在整个字符串中搜索第1个匹配的值

【3】使用findall()方法进行匹配:在整个给定字符串中,搜索所有符合正则规则的字符串

【4】使用sub()替换字符串:

【5】使用split()分割字符串:

 练习:

练习题1:扩展:电话号中间4位变成*

练习题2:ls= ['123我','_咋hello','这php','么','不帅789','呢???']

练习题3:把域名替换成https://localhost/



1.正则表达式:☆

# 专门用来处理字符串的一个规则

定义:记录文本规则的代码

需求:判断用户名长度为8-16位

改变需求:长度为8-16位,字符只能是英文数字下划线,且要大写字母开头 ☆

用代码怎么实现?其实能实现,只是很麻烦!(思路是利用ASCII码)

麻烦,就违背了编程的宗旨:那如何简单呢?就需要用正则表达式处理!☆

1.1 正则写法快速入门

# 分析:学习思路,就是学习pattern这个规则 ☆

常用正则符号:☆

^开头

$结尾

. 表示任意一个字符

* 表示0个或多个

+ 表示1个或多个

? 表示0个或1

{n} 表示重复n

{n,} 表示至少重复n

{n,m} 表示重复n-m

  1. import re
  2. a = 'lhellloll,llll'
  3. pattern = "l{2,}"
  4. res = re.findall(pattern,a)
  5. print(res)
  6. """
  7. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_01.py
  8. ['lll', 'll', 'llll']
  9. """

[xyz] 表示取x或取y或取z

[0-9] 表示取任意一个数字

[a-z] 表示取任意一个小写字母

[A-Z] 表示取任意一个大写字母

[^xyz] 表示取反,除了xyz取其他

[\u4e00-\u9fa5] 表示取任意一个汉字

| 表示选择,或者

\ 表示转义符

r 表示原生字符串:写在规则前面(结论:规则前要加r)

# 可以理解为固定写法:有的需要转义,有的不需要,就直接写r就全不要了

  1. import re
  2. str1 = "hello,xyz,123,789,黑龙江省,哈尔滨市!\d"
  3. pattern = r"\\d"
  4. res = re.findall(pattern,str1)
  5. print(res)
  6. """
  7. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/复习/正则表达式/demo1.py
  8. ['\\d']
  9. """
  1. import re
  2. str1 = "hello,xyz,123,789,黑龙江省,哈尔滨市!\d"
  3. #pattern = r"\\d"
  4. #pattern = r"hello"
  5. pattern = "hello|xyz"
  6. res = re.findall(pattern,str1)
  7. print(res)
  8. """
  9. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/复习/正则表达式/demo1.py
  10. ['hello', 'xyz']
  11. """

1.1.1 利用原生字符r“\()”  规则:

为确保避免不必要的麻烦,还是建议用这个写法:

pattern =re.compile(r'规则')

 pattern = r"\w+" ,这个虽然也可以,但是总感觉有问题。

\d 匹配数字                                                      \D匹配非数字

\w 匹配英文、数字、下划线、汉字         \W匹配非英文、数字、下划线、汉字

  1. import re
  2. str = 'hello,123,美女,___!'
  3. pattern = r"\w+" #匹配一个或多个英文,数字,下划线,汉字
  4. res = re.findall(pattern,str)
  5. print(res)
  6. """
  7. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_01.py
  8. ['hello', '123', '美女', '___']
  9. """

\s 匹配空白符                                                  \S匹配非空白(不包括换行)

  1. import re
  2. str = 'he llo'
  3. pattern = r"\s" #匹配空格
  4. res = re.findall(pattern,str) #str中有多少个空格就会返回多少个空格
  5. print(res)
  6. """
  7. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_01.py
  8. [' ', ' ', ' ']
  9. """

\b 匹配单词的开始或结束,单词分界符通常是空格、标点符号、换行

  1. import re
  2. str1 = 'hello,abxx'
  3. str2 = "hello,ab123"
  4. str3 = "hello,abc__我"
  5. str4 = "hello,cd456"
  6. pattern = r"ab\w+" #匹配出以ab开头的内容
  7. print(re.findall(pattern,str1))
  8. print(re.findall(pattern,str2))
  9. print(re.findall(pattern,str3))
  10. print(re.findall(pattern,str4))
  11. """
  12. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_01.py
  13. ['abxx']
  14. ['ab123']
  15. ['abc__我']
  16. []
  17. """

从下面的例子可以看出,在做匹配的时候,re会以逗号作为单词的分隔符。 

  1. import re
  2. str1 = 'hello,abxx'
  3. str2 = "hello,ab123"
  4. str3 = "hello,abc__我"
  5. str4 = "hello,cd456"
  6. pattern = r"ab\w+" #以ab开头的内容
  7. print(re.findall(pattern,str1))
  8. pattern2 = r"我$" #以“我”结尾
  9. print(re.findall(pattern2,str3))
  10. pattern3 = r"^hello" #以hello开头
  11. print(re.findall(pattern3,str3))
  12. print(re.findall(pattern,str4))
  13. """
  14. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_02.py
  15. ['abxx']
  16. ['我']
  17. ['hello']
  18. []
  19. """

② 使用re模块实现正则表达式:

re模块常用的5个方法☆ match/findall/search/split/sub

【1】使用match()方法进行匹配

从字符串开始处匹配,匹配成功返回Match对象,失败返回None

  1. import re
  2. #需求:匹配字符串是以hello开头的
  3. str1 = "hello,world"
  4. str2 = "world,hello"
  5. str3 = "hello"
  6. pattern = r"hello.*"
  7. print(re.match(pattern,str1).group())
  8. print(re.match(r"hello.*",str1).group())
  9. #以上两种方式等价
  10. print(re.match(r"hello.*",str1))
  11. print(re.match(r"hello.*",str2))
  12. print(re.match(r"hello.*",str3))
  13. print(re.match(r"hello.*",str3).group())
  14. #group() 返回匹配内容
  15. """
  16. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_02.py
  17. hello,world
  18. hello,world
  19. <re.Match object; span=(0, 11), match='hello,world'>
  20. None
  21. <re.Match object; span=(0, 5), match='hello'>
  22. hello
  23. Process finished with exit code 0
  24. """
  1. import re
  2. #将正则表达式翻译成pattern对象
  3. pattern = re.compile(r'\d+')
  4. result = re.match(pattern,'1234abcdef')
  5. if result:
  6. print(result.group())
  7. else:
  8. print("匹配失败!")
  9. print(re.match(r'\w+1234','abcdef1234').group())
  10. print(re.match(r'.*1234','abcdef1234').group())
  11. """
  12. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_03.py
  13. 1234
  14. abcdef1234
  15. abcdef1234
  16. """

【1.1】正则表达式的pattern对象 

#pattern = r'(\w+) (\w+) (?P<word>.*)'
pattern =re.compile(r'(\w+) (\w+) (?P<word>.*)') 由下面的整个程序发现这两种规则是由差别的。 

  1. import re
  2. #正则表达式的pattern对象
  3. #pattern = r'(\w+) (\w+) (?P<word>.*)'
  4. pattern =re.compile(r'(\w+) (\w+) (?P<word>.*)')
  5. match = pattern.match("I am eating")
  6. print("返回匹配的原始字符:",match.string) #返回匹配的原始字符
  7. print("返回匹配的规则:",match.re) #返回匹配的规则
  8. print("获取匹配的开始索引:",match.pos) #获取匹配的开始索引
  9. print("获取匹配结束的索引:",match.endpos) #获取匹配结束的索引
  10. print("最后的索引:",match.lastindex) #最后的索引
  11. print("分组别名:",match.lastgroup) #分组别名
  12. print("以元组形式返回字符:",match.group(1,2,3)) #以元组形式返回字符
  13. """
  14. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_03.py
  15. 返回匹配的原始字符: I am eating
  16. 返回匹配的规则: re.compile('(\\w+) (\\w+) (?P<word>.*)')
  17. 获取匹配的开始索引: 0
  18. 获取匹配结束的索引: 11
  19. 最后的索引: 3
  20. 分组别名: word
  21. 以元组形式返回字符: ('I', 'am', 'eating')
  22. Process finished with exit code 0
  23. """

注意:pattern =re.compile(r'(\w+) (\w+) (?P<word>.*)')

该句中的 (?P<word>.*)是给最后一个分组起别名的意思,r'(\w+)  (\w+)  (?P<word>.*)' 这当中一共有三组。

修改代码:

  1. import re
  2. #正则表达式的pattern对象
  3. pattern =re.compile(r'(?P<word1>.*) (?P<word2>.*) (?P<word3>.*)')
  4. match = pattern.match("I am eating")
  5. print("分组别名:",match.lastgroup) #分组别名(最后一个分组的别名)
  6. print("获取以各组别名为键,以匹配值为值的字典:",match.groupdict()) #获取以各组别名为键,以匹配值为值的字典
  7. print("以元组形式返回字符:",match.group(1,2,3)) #以元组形式返回字符
  8. """
  9. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_03.py
  10. 分组别名: word3
  11. 获取以各组别名为键,以匹配值为值的字典: {'word1': 'I', 'word2': 'am', 'word3': 'eating'}
  12. 以元组形式返回字符: ('I', 'am', 'eating')
  13. """

match.groupdict() #获取以各组别名为键,以匹配值为值的字典

match.group(1,2,3) #以元组形式返回字符

match.lastgroup) #分组别名(最后一个分组的别名)

  1. import re
  2. #正则表达式的pattern对象
  3. pattern =re.compile(r'(?P<word1>.*) (?P<word2>.*) (?P<word3>.*)')
  4. match = pattern.match("I am eating")
  5. print(match.start(1)) #默认起始位置为0
  6. print(match.start(0)) #默认起始位置为0
  7. print(match.end(3)) #默认最后一个索引+1
  8. str1 = "I am eating"
  9. print(str1[match.start(1):match.end(3)])
  10. """
  11. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_03.py
  12. 0
  13. 0
  14. 11
  15. I am eating
  16. """

 print(match.start(n)) #默认起始位置为0        n表示从第几组开始(0,1都是初始位置组)

【1.3】贪婪模式与非贪婪模式 

  1. import re
  2. #贪婪模式与非贪婪模式
  3. '''
  4. 懒惰模式
  5. *? 重复任意次,但尽可能少重复
  6. +? 重复一次 但尽可能少重复
  7. ?? 重复0到1次,尽可能少重复
  8. {m,n}? 重复m,n次 尽可能少重复
  9. {n,}? 重复n次以上 尽可能减少重复
  10. '''
  11. content = "<table><tr><td>你们好</td></tr><tr><td>你们好</td></tr><tr><td>你们好</td></tr><tr><td>你们好a</td></tr></table>"
  12. print(re.findall(r"<td>(.*)</td>",content)) #贪婪模式
  13. print(re.findall(r"<td>(.*?)</td>",content))#非贪婪

【2】使用search()方法进行匹配:在整个字符串中搜索1匹配的值

【3】使用findall()方法进行匹配:在整个给定字符串中,搜索所有符合正则规则的字符串

  1. import re
  2. #需求:匹配字符串中以py开头的内容
  3. str1 = "hello,py_css,py_html,python,ty_java,my_py,my_py_you"
  4. pattern = r"py\w+"
  5. print(re.search(pattern,str1).group()) #只取符合规则的第一个内容
  6. print(re.findall(pattern,str1)) #取出所有符合的内容,并以列表的形式返回
  7. """
  8. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_02.py
  9. py_css
  10. ['py_css', 'py_html', 'python', 'py_you']
  11. """

【4】使用sub()替换字符串

  1. import re
  2. #需求:将电话号码替换成1xxxxxxxxxx
  3. str1 = "恭喜15778475303的用户,成为奈克瑟斯的第99999个转生者"
  4. pattern = r"1[3456789]\d{9}" #表示str1中的电话号码
  5. str1 = re.sub(pattern,"1xxxxxxxxxx",str1)
  6. print(str1)
  7. """
  8. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_02.py
  9. 恭喜1xxxxxxxxxx的用户,成为奈克瑟斯的第99999个转生者
  10. """

【5】使用split()分割字符串

re.split(pattern,string,flag) 能够将字符串按规则进行分割,并且以列表的形式返回 。

  1. import re
  2. #需求:以@#?!分割字符
  3. str1 = "lkw?naruto@163#.com"
  4. patern = r"[@!#?]"
  5. print(re.split(patern,str1))
  6. """
  7. D:\Anaconda3\python.exe D:/Python_file_forAnconda3_python/base_python/python_re_02.py
  8. ['lkw', 'naruto', '163', '.com']
  9. """

 练习:

  1. import re
  2. data =re.findall(r'abcd','abcde')
  3. print(data)
  4. #data2 =re.findall(r'a[0-3]7','a27')
  5. data2 = re.findall(r'a[a-z]7','ac7')
  6. print(data2)
  7. #匹配字符串的数字 \d
  8. #data3 = re.findall(r'a\dc','a2c')
  9. data3 = re.findall(r'a\d+c','a22222c')
  10. print(data3)
  11. #匹配非数字 \D
  12. data4 = re.findall(r'a\Dc','aec')
  13. print(data4)
  14. #匹配空字符串 \s空字符,或者是\n\t\f\v(换行,制表符)
  15. print(re.findall(r'a\sc',"a c"))
  16. #匹配非空字符 \S
  17. print(re.findall(r'a\Sc',"abc"))
  18. #匹配单词字符 \w【A-Z,a-z,0-9_】
  19. print(re.findall(r'a\wc','abc'))
  20. #匹配非单词字符 \W
  21. print(re.findall(r'a\Wc','a+c'))
  22. # * 匹配前一个字符0或无限次
  23. print(re.findall(r'abc*','ab'))#['ab']
  24. # + 匹配前一个字符1或无限次
  25. print(re.findall(r'abc+','abc'))
  26. # {m} 匹配前一个字符m次
  27. print(re.findall(r'ab{5}c','abbbbbc'))#['abbbbbc']
  28. # {m,n} 匹配前一个字符m次到n次
  29. print(re.findall(r'ab{3,5}c','abbbc'))#['abbbc']
  30. #匹配字符串开头
  31. print(re.findall(r'^ab','abbbc'))#['ab']
  32. #print(re.findall(r'^aab','abbbc'))#[]
  33. #匹配字符串结尾
  34. print(re.findall(r'bc$','abbbc'))#['bc']
  35. #print(re.findall(r'bc$','abbbcc'))#[] 即,若匹配的不是以bc结尾,则返回 空
  36. # | 代表左右表达式中任意匹配一个,它总是先尝试匹配左边的表达式,一旦成功会跳过匹配右边的表达式
  37. #如果 | 没有被包括在()中,则它的范围是整个表达式
  38. print(re.findall(r'(abc|def)','abc'))
  39. print(re.findall(r'abc|def','abcdef'))#['abc', 'def']
  40. print(re.findall(r'a(123|456)c','a456c'))#['456']
  41. txt = '<a>appl</a>'
  42. res = re.findall(r'<a>(.*?)</a>',txt)
  43. print(res)#['appl']
  44. #匹配手机号
  45. print(r'^1[0-9]{10}','15778475303')
  46. #匹配邮箱
  47. #字母数字@地址.com
  48. print(re.findall(r'[a-zA-Z0-9]+@[a-zA-Z0-9_-]+[.][a-zA-Z0-9_-]+$','747477910@qq.com'))
  49. #['747477910@qq.com']
  50. print(re.findall(r'[a-zA-Z0-9]+@[a-zA-Z0-9_-]+[.][a-zA-Z0-9_-]+$','LkwNaruto@163.com'))
  51. txt = 'lkwnaruto@163.com'
  52. res = re.findall(r'\w+@163[.]\w+',txt)
  53. print(res)

练习题1:扩展:电话号中间4位变成*

sub的第一个参数是被替换的内容规则,第二个参数是替换的内容 ,第三个是替换的字符串对象。

练习题2:ls= ['123我','_咋hello','这php','么','不帅789','呢???']

需求:匹配输出“我咋这么帅呢”

练习题3:把域名替换成https://localhost/

img = (

    ['<img src="http://www.baidu.com/a.jpg" width="250" height="100" />'],

    ['<img src="http://www.taobao.com/b.jpg" width="250" height="100" />'],

    ['<img src="http://www.zijie.com/c.jpg" width="250" height="100" />']

)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/145673
推荐阅读
相关标签
  

闽ICP备14008679号