xxx 正则、re模块

1. 正则表达式:

正则表达式是一个特殊的字符序列,能方便而快速的检查一个字符串是否满足某种规则。通过正则表达式可以快速的对字符串的内容进行判断和检索。

注意:正则表达式只作用于字符串。

正则表达式的规则:

  • 元字符:.   \w  \s  \d  \n  \t  \b  ^  $  \W  \D  \S  |  (…)   […]   [^…] 
# 为了更好的展示,我们先了解下 re 模块
# re 模块是实现正则的模块
# re.findall(), 是匹配字符串里的所有情况,并返回一个列表
import re
s = '124455whk324天涯'
ret = re.findall('4', s)
print(ret)  # ['4', '4', '4']

# . 匹配换行符以外的任意字符
ret = re.findall('.', s)
print(ret)  # 由于没有换行符,就是全匹配了

# \w 匹配字母/数字/下划线
ret = re.findall('\w', '123agaf_!')
print(ret)  # ['1', '2', '3', 'a', 'g', 'a', 'f', '_']

# 虽然可以直接写 \w,但 \ 在Python中会发生转义,保险起见,一般让正则式子不经过转义
# 即在正则前面加上 r
ret = re.findall(r'\w', '123agaf_!')
print(ret)  # ['1', '2', '3', 'a', 'g', 'a', 'f', '_']

# \s 匹配任意的空白符(\n 和 \t 等)
ret = re.findall(r'\s', 'wgkk\njilk hagkka\tdkhfka')
print(ret)    # ['\n', ' ', '\t']

# \d 匹配数字
ret = re.findall(r'\d', 'ehigh123')
print(ret)    # ['1', '2', '3']

# \n 匹配换行符
ret = re.findall(r'\n', 'wgkk\njilk hag\nka\tdkhfka')
print(ret)    # ['\n', '\n']

# \t 匹配制表符
ret = re.findall(r'\t', 'wgkk\njilk hag\nka\tdkhfka')
print(ret)    # ['\t']

# \b 匹配一个单词边界,即单词和空格间的位置
ret = re.findall(r'er\b', 'never ')
print(ret)     # ['er']
print(re.findall(r'er\b', 'never我'))   # []
import re
# ^ 从字符串的开头匹配
ret = re.findall(r'^\d', '123abc321')
print(ret)  # ['1']

# $ 从字符串的结尾匹配
ret = re.findall(r'\d$', '12ahgk56')
print(ret)  # ['6']

# ^ 加 $ 表示从头到尾,也可看做全匹配
print(re.findall(r'^\d$', '1'))    # ['1']
print(re.findall(r'^\d$', '123'))  # []
# 另一种思路:^ 匹配字符串的开始符, $ 匹配字符串的结束符

# 大写字母的内容与小写字母的相反,如 \w 和 \W
# \W 匹配非数字、字母或下划线 (非‘有意义内容’)
print(re.findall(r'\W', '\n12\t45 ab我'))
# ['\n', '\t', ' ']  # 匹配了换行符、制表符、空格(等)

print(re.findall(r'\w', '我是小学生'))   # \w 也可以匹配汉字
# ['我', '是', '小', '学', '生']

# \D 匹配非数字
print(re.findall(r'\D', 'q3h3i1我\n'))  # ['q', 'h', 'i', '我', '\n']

# \S 匹配非空白符
print(re.findall(r'\S', 'q3我\n'))    # ['q', '3', '我']

# \B 匹配非单词边界,即非单词和空格的边界
print(re.findall(r'e\B', 'here '))  # ['e']  后一个e匹配不到
print(re.findall(r'e\B', 'me我'))   # ['e']
print(re.findall(r'e\B', 'he'))     # []
print(re.findall(r'e\b', 'he'))     # ['e'] 在最后,\b也可以匹配
import re
# |  表示或的意思, a|b 表示匹配a或b
ret = re.findall(r'1|a', '123abc')
print(ret)   # ['1', 'a']

# (…) 匹配括号内的表达式,也表示一个组
# 这个具体看后面的分组

# […] 和 [^…]
# 这两个称为字符组,前者是匹配字符组中的字符;
# 后者是匹配除了字符组中字符的其他所有字符
ret = re.findall(r'[123abc]', 'sabc123456')
print(ret)  # ['a', 'b', 'c', '1', '2', '3']

ret = re.findall(r'[^123a]', '456123avf')
print(ret)  # ['4', '5', '6', 'v', 'f']

# 一些常见用法:
# [0-9] 匹配数字
# [a-z] 匹配小写字母
# [A-Z] 匹配大写字母
# [0-9a-zA-Z_] 匹配数字、字母和下划线
# [a-zA-Z] 匹配字母
# [1-5] 匹配数字1 至 5
# [\s\S] [\d\D] [\w\W]是三组全集 意思是匹配所有字符
  • 量词:*  +  ?   {…}
'''
量词,表示对前一个正则符号的重复次数
'''
import re
# * 重复零次或更多次(0,1次或以上)
print(re.findall(r'\d*', '12345'))  # ['12345', '']

# + 重复1次或更多次(1次或以上)
print(re.findall(r'\d+', '12345'))  # ['12345']

# ? 重复零次或1次
print(re.findall(r'\d?', '12345'))  # ['1', '2', '3', '4', '5', '']

# {n} 重复n次
s = '1,12,123,1234,12345,123456'
print(re.findall(r'\d{4}', s))  # ['1234', '1234', '1234']

# {n,} 重复n次或以上
print(re.findall(r'\d{5,}', s))  # ['12345', '123456']

# {n,m} 重复n到m次
print(re.findall(r'\d{3,5}', s))  # ['123', '1234', '12345', '12345']
  • 贪婪匹配:

 

2. re模块:

 

posted @ 2019-07-28 23:38  Seawa  阅读(68)  评论(0)    收藏  举报