目录
-正则
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。
re提供的方法有:
import re
re.match '''从开始位置开始匹配,如果开头没有则无'''
re.search '''搜索整个字符串'''
re.findall '''搜索整个字符串,返回一个list'''
-修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。
修饰符为一个可选的标志 多个标志可以通过|来指定。如 re.L | re.M
re.search(r'[a-z]+','ajfoavnoaejgN1234ab9').group() #返回'ajfoavnoaejg'
re.search(r'[a-z]+','jafjiNfhfheiHD1234a', re.I).group() #返回'jafjiNfhfheiHD' 对大小写不敏感
-常用匹配模式
模式 | 概述 |
---|---|
\w | 匹配字母数字下划线 |
\W | 匹配非字母数字下划线 |
\s | 匹配任意空白字符,<==> [\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,<==> [0-9] |
\D | 匹配任意非数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配什么开头 |
$ | 匹配什么结尾 |
. | 匹配任意字符(除了\n),当re.DOTALL被指定后,则包括\n |
* | 匹配0或多个表达式 |
+ | 匹配1或多个表达式 |
? | 匹配0或1个表达式,非贪婪 |
{n} | 精确匹配n个前面的表达式 |
{m,n} | 匹配m~n个前面的表达式,贪婪 |
a|b | 匹配a或b |
() | 匹配括号内的表达式,分组 |
[...] | 用来表示一组字符,单独列出,[abc]匹配'a','b','c' |
[^...] | 不在[]中的字符,[^abc]匹配除了abc的字符 |
\G | 匹配最后匹配完成的位置 |
--示例
• \w与\W
print(re.findall('\w','hello weer 123')) #['h', 'e', 'l', 'l', 'o', 'w', 'e', 'e', 'r', '1', '2', '3']
print(re.findall('\W','hello weer 123')) #[' ', ' ']
• \s与\S
print(re.findall('\s','he\rllo\twmq\naj_12')) #['\r', '\t', '\n']
print(re.findall(r'\n','he\rllo\twmq\naj_12')) #['\n']
'''r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义'''
print(re.findall('\S','he\rllo\twmq\naj_12')) #['h', 'e', 'l', 'l', 'o', 'w', 'm', 'q', 'a', 'j', '_', '1', '2']
# \n \t \r都是空,都可以被\s匹配
print(re.findall('\s','hello \n weer \t 123')) #[' ', '\n', ' ', ' ', '\t', ' ']
• \d与\D
print(re.findall('\d','hello weer 123')) #['1', '2', '3']
print(re.findall('\D','hello weer 123')) #['h', 'e', 'l', 'l', 'o', ' ', 'e', 'g', 'o', 'n', ' ']
• ^与$
print(re.findall('^h','hello weer 123')) #['h']
print(re.findall('3$','hello weer 123')) #['3']
• .
print(re.findall('a.b','a1b')) #['a1b']
print(re.findall('a.b','a1b a*b a b aaab')) #['a1b', 'a*b', 'a b', 'aab']
print(re.findall('a.b','a\nb')) #[]
print(re.findall('a.b','a\nb',re.S)) #['a\nb']
print(re.findall('a.b','a\nb',re.DOTALL)) #['a\nb']同上一条意思一样
• *
print(re.findall('ab*','bbbbbbb')) #[]
print(re.findall('ab*','a')) #['a']
print(re.findall('ab*','abbbb')) #['abbbb']
• ?
print(re.findall('ab?','a')) #['a']
print(re.findall('ab?','abbb')) #['ab']
• .*默认为贪婪匹配
print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b']
print(re.findall('a.*','a1b22222222b')) #['a1b22222222b']
• .*?为非贪婪匹配:推荐使用
print(re.findall('a.*?b','a1b22222222b')) #['a1b']
• +
print(re.findall('ab+','a')) #[]
print(re.findall('ab+','abbb')) #['abbb']
• {m,n}
print(re.findall('ab{2}','abbb')) #['abb']
print(re.findall('ab{2,4}','abbb')) #['abb']
print(re.findall('ab{1,}','abbb')) #'ab{1,}' ==> 'ab+'
print(re.findall('ab{0,}','abbb')) #'ab{0,}' ==> 'ab*'
• [ ]
print(re.findall('a[1*-]b','a1b a*b a-b')) #[]内的都为普通字符 且如果-没有被转意的话,应该放到[]的开头或结尾
print(re.findall('a[^1*-]b','a1b a*b a-b a=b')) #[]内的^是取反,所以结果为['a=b']
print(re.findall('a[a-zA-Z]b','a1b a*b a-b a=b aeb aEb'))
• () 分组
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
print(re.findall('(?:ab)+123','ababab123')) #findall的结果不是匹配的全部内容,而是组内的内容, ?:可以让结果为匹配的全部内容
print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>')) #['http://www.baidu.com']
print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">点击</a>'))#
['href="http://www.baidu.com"']
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company')) #['companies', 'company']
-一些正则匹配表达式
Email地址: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
手机号码: ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
身份证号(15位、18位数字): ^\d{15}|\d{18}$
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线): ^[a-zA-Z]\w{5,17}$
强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间): ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
xml文件: ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
腾讯QQ号: [1-9][0-9]{4,} (腾讯QQ号从10000开始)
中国邮政编码: [1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
IP地址.1: \d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
IP地址.2: ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
来源/更多:正则表达式