re模块

匹配模式

  • match
    从头开始匹配,匹配到用group()返回
s = '1234qych7890'

res1 = re.match('[0-9]', s).group()  # 1 匹配到第一个数字
res2 = re.match('[a-z]', s)   # None 第一个不是字母,没匹配到
  • search
    全局匹配,匹配到就返回,用group()取到返回值
s = '1234qych7890'

res1 = re.search('[0-9]', s).group()  # 1
res2 = re.search('[a-z]', s).group()  # q
  • findall
    全局匹配,匹配到的所有的用列表返回
s = '1234qych7890'

res1 = re.findall('[0-9]', s)  # ['1', '2', '3', '4', '7', '8', '9', '0']
res2 = re.findall('[a-z]', s)  # ['q', 'y', 'c', 'h']
  • split
    匹配到的字符当做列表分隔符,比方说几个字母按数字分开,跟findall相反,参数maxsplit
s = '12q34qh789f0'

res1 = re.split('[a-z]+', s)  # ['12', '34', '789', '0']
res1 = re.split('[a-z]+', s,maxsplit=2)  # ['12', '34', '789f0']
  • sub
    匹配字符并替换,sub(pattern,repl,string,count=0,flags=0)
res1 = re.sub('[a-z]','#', '12q34qh789f0')
# 12#34##789#0
  • fullmatch
    全部匹配成功才返回
res1 = re.fullmatch('1234qych7890', '1234qych7890').group()
# 1234qych7890
  • compile
    制定匹配规则
s = '1234qych7890'

pattern = re.compile('\d+')
res1 = pattern.findall(s)  # ['1234', '7890']

标识符flag

  • I
    忽略大小写
  • M
    多行模式,改变^$,按照一行一行来看了,换行符从符号变成了实际的行
  • S
    改变.,包括了换行符,即所有字符
  • X
    可以添加注释

字符

  • .
    匹配任意除换行符'\n'外的字符
res1 = re.findall('.', '1234qych\n7890')
# ['1', '2', '3', '4', 'q', 'y', 'c', 'h', '7', '8', '9', '0']
  • \
    转义字符

  • [...]
    范围内的字符,^表示取反

s = '1234qych7890'

res1 = re.findall('[a-z]', s)  #  ['q', 'y', 'c', 'h']
res1 = re.findall('[^a-z]', s)  #  ['1', '2', '3', '4', '7', '8', '9', '0']

预定义字符

  • \d
    数字,相当于[0-9]
res = re.findall('\d', '1234qych7890')
#  ['1', '2', '3', '4', '7', '8', '9', '0']
  • \D
    非数字,[^\d]
res = re.findall('\D', '1234qych7890')
#  ['q', 'y', 'c', 'h']
  • \s
    空白字符串,\t\r\n\f\v
res = re.findall('\s', '1234qych\n7890')
#  ['\n']
  • \S
    非空白字符串,[^\s]
res = re.findall('\S', '1234qych\n7890')
#  ['1', '2', '3', '4', 'q', 'y', 'c', 'h', '7', '8', '9', '0']
  • \w
    字母数字下划线,[A-Za-z0-9]
res = re.findall('\w', '1234qych\n7890')
#  ['1', '2', '3', '4', 'q', 'y', 'c', 'h', '7', '8', '9', '0']
  • \W
    非字母数字下划线,[^\w]
res = re.findall('\W', '1234qych\n7890')
#  ['\n']

数量

  • *
    匹配前一个字符0或者无限次
res = re.search('ab*', 'abbbcd').group()  # abbb
res = re.search('ab*', 'aabbbcd').group()  # a
  • +
    匹配前一个字符1或者无限次
res1 = re.search('ab+', 'abbbcd').group()  # abbb
res2 = re.search('ab+', 'aabbbcd').group()  # abbb
  • ?
    匹配前一个字符0或者1次
res1 = re.search('ab?', 'abbbcd').group()  # ab
res2 = re.search('ab?', 'aabbbcd').group()  # a
  • {m}
    匹配前一个字符m次
res1 = re.search('ab{2}', 'abbbcd').group()  # abb
  • {m,n}
    匹配前一个字符m到n次
res2 = re.search('ab{1,3}', 'aabbbcd').group()  # abbb
  • *?,+?,??,{m,n}?
    变成非贪婪匹配
res2 = re.search('ab{1,3}?', 'aabbbcd').group()  # ab

边界匹配

  • ^,\A
res1 = re.search('^aab\d+', 'aab112').group()
#  aab112
  • $,\Z
res1 = re.search('[a-z]+112$', 'aab112').group()
#  aab112
  • \b
    没搞懂
  • \B

逻辑分组

  • |
    或,多组从左到右依次匹配,单个字符
    先尝试匹配左边的,成功则跳过右边,失败则匹配右边
res1 = re.search('(a|b|A)lex', 'Alex').group()
#  Alex
res1 = re.search('(a|b|A)lex', 'alex1234Alex').group()
#  alex
  • (...)
    分组
res1 = re.search('(ab){2}\d+', 'abab123df').group()
#  abab123
res1 = re.search('(ab).*(df)', 'abab123cdf').groups()
#  ('ab', 'df')
  • (?P<name>...)
    分组,加上别名
res1 = re.search('(?P<privince>\d{4})(?P<city>\d{4})', '12345678').groupdict()
#  {'privince': '1234', 'city': '5678'}

参考资料

posted @ 2019-05-07 14:36  球球-Ball  阅读(141)  评论(0编辑  收藏  举报