翼度科技»论坛 编程开发 python 查看内容

python笔记:第十一章正则表达式

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
1.模块re


  • 以一定规则,快速检索文本,或是实现一些替换操作
  • 默认下,区分大小写
2.常见的匹配字符表

字符描述\d代表任意数字,就是阿拉伯数字 0-9 这些\D代表非数字的字符。与\d完全相反\w代表字母,数字,下划线。也就是 a-z、A-Z、0-9、_\W跟 \w 相反 ,代表不是字母,不是数字,不是下划线的字符。\n代表一个换行。\r代表一个回车。\f代表换页。\t代表一个 Tab 。\s代表所有的空白字符,也就是上面这四个:\n、\r、\t、\f。\S跟 \s 相反,代表所有不是空白的字符。\A代表字符串的开始。\Z代表字符串的结束。^匹配字符串开始的位置。$匹配字符创结束的位置。.代表所有的单个字符,除了 \n \r[...]代表在 [] 范围内的字符,比如 [a-z] 就代表 a到z的字母[^...]跟 [...] 唱反调,代表不在 [] 范围内的字符{n}匹配在 {n} 前面的东西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的两个o。{n,m}匹配在 {n,m} 前面的东西,比如:o{1,3} 将匹配fooooood中的前三个o。{n,}匹配在 {n,} 前面的东西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配fooooood中的所有o。*和 {0,} 一个样,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”。+和{1,} 一个样,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。?和{0,1} 一个样,匹配 ?前面 0 次或 1 次。a|b匹配 a 或者 b。()匹配括号里面的内容。
  1. a = 'C|C++|C#|Python|Java'
  2. # 判断字符串 a 中是否含有 Python
  3. print(a.index('Python')>-1)   #  True
  4. print('Python' in a)   #  True
  5. import re
  6. re.findall('Python', a)  #  在字符串 a 中,找到所有的'Python'字符串
  7. print(re.findall("Python", a))  #  ['Python']
复制代码
2.1/d /D
  1. import re
  2. a = 'C0C++1C#2Python3Java'
  3. # 检索所有数字
  4. r = re.findall('\d', a)  #  \d 匹配所有数字  元字符的一种
  5. print(r)  # ['0', '1', '2', '3']
  6. r = re.findall('\D', a)  #  \d 匹配所有非数字  元字符的一种
  7. print(r)  # ['0', '1', '2', '3']
  8. # ['C', 'C', '+', '+', 'C', '#', 'P', 'y', 't', 'h', 'o', 'n', 'J', 'a', 'v', 'a']
复制代码
2.2[]  表示或
  1. #  []  表示或
  2. import re
  3. s = 'abc, acc, adc, aec, afc, ahc'
  4. r = re.findall('a[cf]c', s) # 匹配中间是 c 或 f 的字符串
  5. print(r)  # ['acc', 'afc']
  6. # [^]   表示否定
  7. r = re.findall('a[^cf]c', s) # 匹配中间不是 c 和 f 的字符串
  8. print(r)  # ['abc', 'adc', 'aec', 'ahc']
  9. #  [c-f]   匹配c 到 f 的所有字符
  10. r = re.findall('a[c-f]c', s) # 匹配 c 到 f 的字符
  11. print(r)  # ['acc', 'adc', 'aec', 'afc']
复制代码
2.3\w \W
  1. # 概括字符集
  2. # \w   \W
  3. import re
  4. a = 'C0C++\n1C# 2Python3*Java_'
  5. r = re.findall('\w', a) # 匹配数字和字母  相当于  [A-Za-z0-9_]
  6. print(r)  
  7. # ['C', '0', 'C', '1', 'C', '2', 'P', 'y', 't', 'h', 'o', 'n', '3', 'J', 'a', 'v', 'a', '_']
  8. r = re.findall('\W', a)  # 非单词字符  
  9. print(r)  #  ['+', '+', '\n', '#', ' ', '*']
  10. # \s  空白字符
  11. r = re.findall('\s', a)
  12. print(r)  # ['\n', ' ']
复制代码
2.4{}  表示匹配次数
  1. # 数量词  
  2. #  {4}   4 表示每次匹配次数
  3. import re
  4. a = 'python 11 java 22 php'
  5. r = re.findall('[a-z]{3}', a)
  6. print(r)  # ['pyt', 'hon', 'jav', 'php']
  7. # {3, 6}  表示匹配次数在 3到6 之间
  8. r = re.findall('[a-z]{3,6}', a)
  9. print(r)  # ['python', 'java', 'php']
复制代码
2.5贪婪 非贪婪
  1. # 贪婪 非贪婪
  2. # python 默认为贪婪模式  尽可能 多匹配 和 多次匹配
  3. # 非贪婪模式  表达式后面加 ? 匹配最少的次数
  4. r = re.findall('[a-z]{3,6}?', a)
  5. print(r)  # ['pyt', 'hon', 'jav', 'php']
复制代码
2.6*  +
  1. # * 匹配 0 次或者无限多次
  2. a = 'pytho0python1pythonn2'
  3. r = re.findall('python*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
  4. print(r) # ['pytho', 'python', 'pythonn']
  5. r = re.findall('pytho*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
  6. print(r) # ['pytho', 'pytho', 'pytho']
  7. r = re.findall('pythonn*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
  8. print(r) # ['python', 'pythonn']
  9. # + 匹配一次或无限多次
  10. import re
  11. r = re.findall('python+', a) # 与 * 紧挨的字符n 匹配1次或是无限多次
  12. print(r) # ['python', 'pythonn']
  13. # 不加 ?  
  14. r = re.findall('python{1,2}', a) # 匹配n 出现一次到两次
  15. print(r) # ['python', 'pythonn']
  16. # 加了 ?  
  17. r = re.findall('python{1,2}?', a) # 匹配n 出现一次
  18. print(r) # ['python', 'python']
复制代码
2.7^ $  边界符
  1. # 边界匹配
  2. import re
  3. qq = '1000001'
  4. r = re.findall('\d{4,8}', qq) # 匹配4 到8 位的QQ号
  5. print(r)  # ['1000001']
  6. qq = '10000000001'
  7. r = re.findall('\d{4,8}', qq) # 匹配4 到8 位的QQ号
  8. print(r)  # ['1000001']     没有达到目的
  9. # ^ $ 边界符  
  10. # ^ 规定以什么开始
  11. # $ 规定以什么结束
  12. r = re.findall('^\d{4,8}$', qq) # 匹配4 到8 位的QQ号
  13. print(r)  # []   没有匹配到
  14. r = re.findall('^0000', qq) # 匹配从 0 开始的字符串
  15. print(r)  # []   没有匹配到
复制代码
2.8()  分组
  1. # ()  一个括号对应一组
  2. import re
  3. a = 'pythonpythonpythonJs'
  4. r = re.findall('(python){3}(JS)', a)
  5. print(r)  # []
  6. # re.I 不区分大小写  第三个参数
  7. r = re.findall('(python)(JS)', a, re.I)
  8. print(r)  # [('python', 'Js')]
  9. # 接受多个第三个参数时,用|隔开
  10. r = re.findall('(python)(JS)', a, re.I | re.S)
  11. print(r)  # [('python', 'Js')]
复制代码
2.9. 匹配除换行符\n 以外的其他所有字符
  1. # . 匹配出换行符\n 以外的其他所有字符
  2. a = 'python\nCC'
  3. r = re.findall('python.', a, re.I)
  4. print(r)  # []   无法匹配\n
  5. r = re.findall('python.', a, re.S)   #  让 . 可以匹配换行符
  6. print(r)  # ['python\n']   
复制代码
2.10re.sub 替换操作
  1. # re.sub 替换操作
  2. import re
  3. language = 'PythonC#JavaC#PHPC#'
  4. r = re.sub('C#', 'GO', language)
  5. print(r)   # PythonGOJavaGOPHPGO
  6. r = re.sub('C#', 'GO', language, 1)
  7. print(r)   # PythonGOJavaC#PHPC#   只替换了一个
  8. r = re.sub('C#', 'GO', language, 0)
  9. print(r)   # PythonGOJavaGOPHPGO
  10. # re.sub 的第二个参数可以是函数
  11. def convert(value):
  12.     pass
  13. r = re.sub('C#', convert, language)
  14. print(r)  # PythonJavaPHP
  15. def conver(value):
  16.     matched = value.group()
  17.     return '!!' + matched + '!!'
  18. r = re.sub('C#', convert, language)
  19. print(r)   # Python!!C#!!PHP!!C#!!
复制代码
2.11将函数作为参数
  1. # 将函数作为参数
  2. import re
  3. s = 'ABC37978D432'
  4. def convert(value):
  5.     # 拿到具体数字
  6.         matched = value.group()
  7.         if matched >= 6:
  8.         return 9
  9.     else:
  10.         return 0
  11.    
  12. r = re.sub('\d', convert, s)
  13. print(r)  # ABC09999D000
复制代码
2.12re.match  re.search
  1. # re.match
  2. # re.search   
  3. # 都返回类对象
  4. import re
  5. s = 'ABC37978D432'
  6. r = re.match('\d', s)  #  从字符串的开始位置开始匹配,若不符,则返回None
  7. print(r)  # None
  8. r = re.search('\d', s) #  在字符串中寻找可以匹配的
  9. print(r)  # <re.Match object; span=(3, 4), match='3'>
  10. print(r.group())  # 3
  11. print(r.span())   # (3, 4)   返回匹配的区间
复制代码
2.13group 分组
  1. # group 分组  
  2. # group()   默认值为 0   返回正则的完整匹配结果
  3. import re
  4. s = 'life is short, i use python'
  5. r = re.search('life.*python', s)
  6. print(r.group())  # life is short, i use python
  7. # () 进行分组
  8. r = re.search('(life.*python)', s)
  9. print(r.group(0))  # life is short, i use python
  10. # group(1)
  11. r = re.search('life(.*)python', s)
  12. print(r.group(1))  #  is short, i use
  13. r = re.findall('life(.*)python', s)
  14. print(r)  #  is short, i use
  15. s = 'life is short, i use python, i love python'
  16. r = re.search('life(.*)python(.*)python', s)
  17. print(r.group(0))  # life is short, i use python, i love python
  18. print(r.group(1))  #  is short, i use
  19. print(r.group(2))  # , i love
  20. print(r.group(0,1,2)) # ('life is short, i use python, i love python', ' is short, i use ', ', i love ')
  21. print(r.groups())  #  (' is short, i use ', ', i love ')
复制代码
一些例子
  1. 正则表达式
  2. import re
  3. line = 'booooooooobbby123'
  4. r = re.match(".*(b.*b).*", line)
  5. print(r.group(1))       #贪婪模式下,检索到最后符合的内容
  6. print(r.group(0))
  7. r = re.match(".*?(b.*?b).*", line)      #对  ? 后面的 检索进行非贪婪模式
  8. print(r.group(1))  
  9. #  +
  10. print('~+~~~~~~~~~')
  11. r = re.match(".*(b.+b)", line)      #+ 前面内容至少出现一次
  12. print(r.group(1))  
  13. print('|||||')
  14. r = re.match(".*(bbb|bby123)", line)      #  | 或关系 存在一个即可
  15. print(r.group(1))  
  16. print('|||||')
  17. r = re.match(".*(bby123|bbb)", line)      #  | 或关系 存在一个即可
  18. print(r.group(1))
  19. line2 = '15541861937'
  20. regex_str = "(1[2345][0-9]{3})"
  21. r = re.match(regex_str, line2)
  22. print(r.group(0))
  23. #汉字
  24. print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
  25. line = '你好吗'
  26. r = re.match("[\u4E00-\u9FA5]+", line)
  27. print(r.group(0))
  28. print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
  29. line = '你  好吗'
  30. r = re.match("[\u4E00-\u9FA5]+", line)
  31. print(r.group(0))
  32. print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
  33. line = 'study in 北京大学'
  34. r = re.match(".*([\u4E00-\u9FA5]+大学)", line)
  35. print(r.group(1))
  36. print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
  37. line = 'study in 北京大学'
  38. r = re.match(".*?([\u4E00-\u9FA5]+大学)", line)
  39. print(r.group(1))
  40. line = 'XXX出生于2001年6月'
  41. line = 'XXX出生于2001/6/1'
  42. line = 'XXX出生于2001-6-1'
  43. line = 'XXX出生于2001-06-01'
  44. line = 'XXX出生于2001-06'
  45. regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"
复制代码
来源:https://www.cnblogs.com/lmc7/p/17566641.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具