正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。

  正则表达式(常缩写成:regex),也是对字符串进行操作的一种逻辑公式,用事先定义好的一些特定字符(元字符)、及这些特定字符的组合,组成一个‘规则字符串’,用来表达对字符串的一种规则逻辑(称作‘匹配’)。

一、关于元字符

(一)'\' 转义 

  '\' 在某些普通字符前,将普通字符转义为特殊字符。如:'\t'下一个TAB位置(水平)、'\v'下一个TAB位置(垂直)、'\b'移到前一列、'\a'响铃、'\0'空字符、'\n'换行、'\f'换页、‘r'回车。

  '\' 在转义字符前,后面的转义取消,直接按普通字符处理。在字符串前加'r',同样具有取消转义的作用。

print('\n')     # '\n'作为转义字符,表示换行。
print('\\n')    # 第一个'\'是取消第二个'\'的转义,输出为:\n
print(r'\n')    # 'r'禁止转义,输出为:\n
print(r'\\n')   # 'r'禁止转义,输出为:\\n
View Code

(二)'.' 通配符

  匹配除'\n'之外的任何单个字符。使用时,需要注意关于转义字符的匹配。  若需要匹配含有'\n'之内的所有字符,可以使用[\s\S]。

import re
# '.'匹配除'\n'之外的任何单个字符,包含一个空格符,但不包含空字符。
s = 'ow o\nw o\\nw oww o\w onw'
ret = re.findall('o.w',s)
print(ret,type(ret))    #['oww', 'o\\w', 'onw'] <class 'list'>
# 使用时,需要特别注意关于转义字符的匹配。
s = 'o\r\w o\\rw o\f\fw o\bbw'
ret = re.findall('o..w',s)
print(ret,type(ret))    #['o\r\\w', 'o\\rw', 'o\x0c\x0cw', 'o\x08bw'] <class 'list'>
# 用[\s\S]可以匹配所有单个字符,不含空字符。
s = 'ow o\nw o\\nw oww o\w onw'
ret = re.findall('o[\s\S]w',s)
print(ret,type(ret))    #['o\nw', 'oww', 'o\\w', 'onw'] <class 'list'>
View Code

  (三)'*'、'+'、'?' 关于匹配次数

  ‘*’ 匹配前面的表达式 0 或 多次。    ‘+’ 匹配前面的表达式 1 或 多次。  ‘?’ 匹配前面的表达式 0 或 1次。

import re
s = 'wooooow ww wow '
# '+' : 1 或 多次
ret = re.findall('wo+w',s)
print(ret)  #['wooooow', 'wow']
# '*' : 0 或 多次
ret = re.findall('wo*w',s)
print(ret)  #['wooooow', 'ww', 'wow']
# '?' : 0 或 1次
ret = re.findall('wo?w',s)
print(ret)  #['ww', 'wow']
View Code

  注意:‘?’字符若使用在任何其他限制字符后面,匹配模式是非贪婪的,即尽可能少的匹配搜索的字符串。

import re
s = 'wooooo'
ret = re.findall('wo*',s)  # '*'贪婪匹配
print(ret)  #['wooooo']
ret = re.findall('wo*?',s) # '*?'非贪婪匹配,尽可能少的匹配字符串
print(ret)  #['w']
ret = re.findall('wo?',s) # '?'贪婪匹配,尽可能多的匹配字符串
print(ret)  #['wo']
View Code

  (四)'^' 、'$' 定位符

  '^' 匹配字符串的开始位置;'$' 匹配字符串的结尾位置。  在MULTILINE模式下,可匹配每一行的开始或结尾。

import re
# '^'匹配字符串的开头。
s = 'oo hello world \nooo!'
ret = re.findall('^oo.',s)
print(ret)  #['oo ']
# 在MULTILINE的模式下,可匹配每一行的开始。
ret = re.findall('^oo.',s,re.MULTILINE)
print(ret)  #['oo ', 'ooo']

# '$'匹配每一行的结尾。
s = 'hello world\n hello worldd'
ret = re.findall('.d$',s)
print(ret)  #['dd']
# 在MULTILINE的模式下,可匹配每一行的结尾。
ret = re.findall('.d$',s,re.MULTILINE)
print(ret)  #['ld', 'dd']
View Code

  (五)其它一些匹配字符

  '\d' 匹配十进制数[0-9];'\D' 匹配非数字字符[^0-9]。

  '\w' 匹配任何字母、数字;'\W' 匹配任何非字母、数字。

  '\s' 匹配空白字符;'\S' 匹配非空白字符。

  '\b' 匹配单词边界;'\B' 匹配非单词边界。

import re
#逐个字符匹配
s = 'jfn 4j 3\n 3 feo'
print(re.findall('',s))     # 空字符'’数量为字符串长度+1,含字符串开始前‘’和结尾后‘’。
#['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
print(re.findall('\d',s))   # 字符串内全部数字
#['4', '3', '3']
print(re.findall('\D',s))   # 字符串内其它非数字
#['j', 'f', 'n', ' ', 'j', ' ', '\n', ' ', ' ', 'f', 'e', 'o']
print(re.findall('\w',s))   # 字符串内全部字母、数字
#['j', 'f', 'n', '4', 'j', '3', '3', 'f', 'e', 'o']
print(re.findall('\W',s))   # 字符串内其它非字母、数字
#[' ', ' ', '\n', ' ', ' ']
print(re.findall('\s',s))   # 字符串内空格字符,含'\n'。
#[' ', ' ', '\n', ' ', ' ']
print(re.findall('\S',s))   # 字符串内非空格字符
#['j', 'f', 'n', '4', 'j', '3', '3', 'f', 'e', 'o']
print(re.findall('f.\\b',s))   # 匹配非单词边界,注意'\b'具有转义,需要使用'\\b'。
#['fn']
print(re.findall('.e\B',s))   # 匹配非单词边界
#['fe']
View Code