正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式(常缩写成: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
(二)'.' 通配符
匹配除'\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'>
(三)'*'、'+'、'?' 关于匹配次数
‘*’ 匹配前面的表达式 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']
注意:‘?’字符若使用在任何其他限制字符后面,匹配模式是非贪婪的,即尽可能少的匹配搜索的字符串。
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']
(四)'^' 、'$' 定位符
'^' 匹配字符串的开始位置;'$' 匹配字符串的结尾位置。 在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']
(五)其它一些匹配字符
'\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']

浙公网安备 33010602011771号