python 字符串之常用正则,,一、前面简单写了一下


一、前面简单写了一下re模块操作字符串的写法,加上正则之后 re模块才能发挥更强大的功能。

先看看常见的正则符号:

技术分享图片

复习一下基础的re模块:

import retext = ‘c++ python2 python3 perl ruby lua java javascript php4 php5 c‘#match,search,findall,split,subre.match(r‘java‘,text)#只找头,没有的话返回none 返回一个<_sre.SRE_Match object; span=(34, 38), match=‘java‘>re.search(r‘java‘,text)#从头开始找,找符合的字符# <_sre.SRE_Match object; span=(34, 38), match=‘java‘>re.match(r‘c\++‘,text),re.match(r‘c\+\+‘,text)#作用相同#<_sre.SRE_Match object; span=(0, 3), match=‘c++‘>re.findall(r‘python‘,text) #返回所有的python# [‘python‘, ‘python‘]re.split(r‘ perl ‘,text)#以某个字符为中心拆分#[‘c++ python2 python3‘, ‘ruby lua java javascript php4 php5 c‘]re.sub(r‘ruby‘,‘fortran‘,text) #替换某个字符#‘c++ python2 python3 perl fortran lua java javascript php4 php5 c‘

二、正则常用

text = ‘c++ python2 python3 perl ruby lua java javascript php4 php5 c‘
1 ^   start 从开头开始匹配
  例: re.findall(r‘^c..‘,text)
        输出#[‘c++‘]


2 . except \n 匹配除换行符以外所有字符
    re.findall(r‘^c‘,text)
      #[‘c‘]
re.findall(r‘^c.‘,text)
#[‘c+‘]


3 + 1-inf 匹配一个或一个以上相同的值从1---无穷
   re.findall(r‘c+‘,text)
    #[‘c‘, ‘c‘, ‘c‘]
   re.findall(r‘c\++‘,text)
    #[‘c++‘]

4 $ end 匹配最后一个字符
    re.findall(r‘c$‘,text)




5 [] or 指的是或
  re.findall(r‘p[a-zA-Z]+‘,text) #匹配p字符后面是(a-z)从小写字符a-z和大写A-Z的字符 #{1,}匹配1到无穷个
    #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘]

6 * 0-inf 0到无穷个
  re.findall(r‘p[a-zA-Z]*‘,text)
    #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘]

7 ? 0-1 匹配0--1个
  re.findall(r‘p[a-zA-Z]?‘,text)
    #[‘py‘, ‘py‘, ‘pe‘, ‘pt‘, ‘ph‘,‘p‘, ‘ph‘, ‘p‘]
  re.findall(r‘p[a-zA-Z0-9]{3,}‘,text) #{3,}指的是匹配三个字母以上
    #[‘python2‘, ‘python3‘, ‘perl‘, ‘php4‘, ‘php5‘]

  re.findall(r‘c[a-zA-Z]*‘,text)
    #[‘c‘, ‘cript‘, ‘c‘]
  re.findall(r‘c[^a-zA-Z]*‘,text) # ^号也可以指非的意思(当^号在中括号里面) 匹配非字母的符号
    #[‘c++ ‘, ‘c‘, ‘c‘]

8 | or 或也可以写成|号 看看他与[]号的区别
  re.findall(r‘[pj][a-zA-Z]+‘,text) #{1,inf}
    #[‘python‘, ‘python‘, ‘perl‘, ‘java‘, ‘javascript‘, ‘php‘, ‘php‘]
 |重写上面的pattern
  re.findall(r‘p|j[a-zA-Z]+‘,text) #|号指的是前面的或者是后面的因此需要修改程序
    #[‘p‘, ‘p‘, ‘p‘, ‘java‘, ‘javascript‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘]
  re.findall(r‘p[a-zA-z]+|j[a-zA-Z]+‘,text) #相当于[pj][a-z][A-Z]的分开
  re.findall(r‘p[^0-9]+|j[a-zA-Z]+‘,text) #注意空格也会被匹配为非数字
    #[‘python‘, ‘python‘, ‘perl ruby lua java javascript php‘, ‘php‘]
  re.findall(r‘p[^0-9 ]+|j[a-zA-Z]+‘,text)
    #[‘python‘, ‘python‘, ‘perl‘, ‘java‘, ‘javascript‘, ‘php‘, ‘php‘]

9 \w [a-zA-Z0-9_], \W #匹配所有的小写大写下划线 \W指的是\w的非

  re.findall(r‘p\w+‘,text)
    #[‘python2‘, ‘python3‘, ‘perl‘, ‘pt‘, ‘php4‘, ‘php5‘]

10 \d [0-9], \D ##匹配所有的数字 \D是\d的非
  re.findall(r‘p\w+\d‘,text)
  re.findall(r‘p\w+[0-9]‘,text)
  re.findall(r‘p\w{5,9}‘,text) #匹配有5--9个字符
    #[‘python2‘, ‘python3‘]

11 \s [ \t\n\r\f\v], \S#匹配所有的空白字符



12 \b word boundary 匹配一个字符的边界,以什么开始什么结束
  re.findall(r‘\bp[^0-9]‘,text)
    #[‘py‘, ‘py‘, ‘pe‘, ‘ph‘, ‘ph‘]
  re.findall(r‘p[^0-9]\b‘,text)
    #[‘pt‘]
13 \B not \b
  \A input start, ^
   \Z input end, $ 同上


14 贪婪与非贪婪
 *贪婪模式尽可能的匹配多
*? 0~inf non-greedy #非贪婪模式尽可能匹配少
+? 1~inf non-greedy #非贪婪模式尽可能匹配少
re.findall(r‘p[a-z]*‘,text)
  #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘]
re.findall(r‘p[a-z]*?‘,text)
  #[‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘]
re.findall(r‘p[a-z]+\b‘,text)
re.findall(r‘p[a-z]+?\b‘,text)

15 分组
(?P<name>pattern)
a=re.search(r‘(p[a-zA-Z]+)([0-9])‘,‘python2‘,re.X) #re.X可以不写(re.X)编译字符里面可以注释
a.group(1), a.group(2)
  #‘python‘
  #‘2‘

a=re.search(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘,‘python2‘) #以字典形式输出
a.group(‘name‘), a.group(‘version‘)
a.groupdict()
  #{‘name‘: ‘python‘, ‘version‘: ‘2‘}

16 混合编写
pattern = re.compile(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘)#公式
results = pattern.search(‘python2‘)#带入
print (results.groupdict())
results = pattern.search(‘python3‘)
print (results.groupdict())
results = pattern.search(‘php4‘)
print (results.groupdict())
  #{‘name‘: ‘python‘, ‘version‘: ‘3‘}

17 字典循环
import re
text = ‘c++ python2 python3 perl ruby lua java javascript php4 php5 c‘
pattern = re.compile(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘)#公式
for t in text.split(‘ ‘):
results = pattern.search(t)
if results:
print (results.groupdict())
  #{‘name‘: ‘python‘, ‘version‘: ‘2‘}
  #{‘name‘: ‘python‘, ‘version‘: ‘3‘}
  #{‘name‘: ‘php‘, ‘version‘: ‘4‘}
  #{‘name‘: ‘php‘, ‘version‘: ‘5‘}

18 编译字符re.X
a = re.compile(r"""\d + # 整数部分
\. # 小数点
\d * # 小数部分
""", re.X) #可以转化成一行
b = re.compile(r"\d+\.\d*")


python 字符串之常用正则

评论关闭