Python 正则表达式小结

2019-02-24  本文已影响0人  马本不想再等了

1. 特殊字符

  1. ^ $ * ? + {2} {2, } {2, 5} |
  2. [] [^] [a-z] .
  3. \s \S \w \W
  4. [\u4E00-\u9FA5] () \d

2. 示例

^ $ . * 示例

import re


line = "maben123123"
# 以m开头,.中间任意字符,*任意多个,以3结尾
regex_str = "^m.*3$"
match_obj = re.match(regex_str, line )
if match_obj:
    print('yes')
>>> yes

贪婪模式 示例

import re


line = "mabenbb123123"
# 这里默认是贪婪模式,从后端开始匹配,先找到第一个b,.*代表任意字符任意长度,再到第二个b,这样就导致直接匹配出两个b
regex_str = ".*(b.*b).*"
match_obj = re.match(regex_str, line )
if match_obj:
    print(match_obj.group(1))
>>> bb

? 与 贪婪模式 示例

import re


line = "mabenbbasdbb123123"
''' 
?代表正向,且只取第一个(非贪婪),先找到第一个b,.*代表任意字符任意长度,再到第二个b,这样就直接匹配出benb。
这里,第一个?起到正向匹配的作用,第二个?起到只取一个(非贪婪)的作用,如没有第二个?会输出benbbasdbb
'''
regex_str = ".*?(b.*?b).*"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))
>>> benb

+ 示例

import re


line = "mabenbbasdbb123123"
# +代表中间至少出现一次,这样bb就不符合要求了,故会出现basdbb
regex_str = ".*(b.+b).*"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))
>>> basdbb

{1} 示例

import re


line = "mabenbbbasdbb123123"
# {1}代表必须出现一次,故只有bbb符合
regex_str = ".*(b.{1}b).*"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))
>>> bbb

{2,} 示例

import re


line = "mabenbbbasdbb123123"
# {2, }代表至少出现两次,故只有basdbb符合,从后往前匹配。
regex_str = ".*(b.{2,}b).*"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))
>>> basdbb

{2,3} 示例 注:{2, 3}是错误的写法,,后不能有空格

import re


line = "mabenbbbasdbb123123"
# {2,3}至少出现2次,至多出现3次,从后端开始匹配,故basdb
regex_str = ".*(b.{2,3}b).*"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))
>>> basdb

| 以及 group 示例

import re


line = "mabben123123"
# | 代表或的意思,但是如果两个别打是同时满足,会默认匹配第一个
regex_str = ".*((maben|mabben)123).*"
match_obj = re.match(regex_str, line)
if match_obj:
    # group()中数字0或空代表提取全部内容,1代表提取括号中的内容,2代表提取两层括号中的内容
    print(match_obj.group(0))
    print(match_obj.group(1))
    print(match_obj.group(2))

[ ] 示例

import re


line = "15902992018"
# []中的意思是满足其中任意一个
regex_str = "(1[35789][0-9][^1]{9})"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))
>>> 15902992018

总结[ ]的用法 :
[0-9] 代表一个区间内的所有字符
[45786] 代表中括号中的所有字符
[^1]{9} 代表接下来的9位中不能有1
[.] 代表 .号 本身

部分常用表达式:
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\w 匹配字母数字及下划线,等价于 [0-9_a-zA-Z]
\W 匹配非字母数字及下划线
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字

[\u4E00-\u9FA5] 示例1

import re


line = "你好s"
# [\u4E00-\u9FA5]是unicode编码中的汉字范围,只提取汉字,+代表多个。
regex_str = "([\u4E00-\u9FA5]+)"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))
>>> 你好

[\u4E00-\u9FA5] 示例2 从英文中提取中文

import re


line = "studay in 北京大学"
# [\u4E00-\u9FA5]是unicode编码中的汉字范围,只提取汉字,+代表多个。
regex_str = ".*?([\u4E00-\u9FA5]+大学)"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))
>>> 北京大学
上一篇 下一篇

猜你喜欢

热点阅读