笔记性质、非教程
CHAPTER-1 尝试
CHAPTER-2 从零开始学正则
CHAPTER-3 THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.
参考:
1、入门 --> here
2、菜鸟教程 --> here
3、常用正则表达式 --> here
正文:
CHAPTER-1 尝试
1、匹配qq号。(5到10位任意数字)
import re numbers = ['1234', '123456', '12345678901'] for x in numbers: print(re.match(r'^\d{5,10}$', x))
2、匹配用户名(由字母和数字组成,必须由字母开头,4到10位)注:\w会匹配数字。
import re strs = ['abc', '1abcd', '1997abc', 'a199', 'abc1997'] for x in strs: print(re.match(r'^[a-zA-z][0-9a-zA-z]{3,9}$', x))
3、匹配邮箱
import re strs = ['@qq.com', '33@', '22@ee.', '[email protected]', '[email protected]'] for x in strs: print(re.match(r'^\w{1,20}@(|vip.)[a-z0-9]{1,12}(.com|.net)$', x))
4、匹配类似这样的日期2017-05-04
import re strs = ['19-2-1', '1997-10', '1999-2-2', '1777-19-19', '1889-12-31'] for x in strs: print(re.match(r'^\d{4}-\d{2}-\d{2}$', x))
CHAPTER-2 从零开始学正则
参考:《Introducing Regular Expressions》
1、匹配北美电话号码。
import re strs = ['770-827-7019'] for x in strs: print(re.match(r'770-827-7019', x)) # 用string literal匹配目标字符串 print(re.match(r'7', x)) print('\n')
output: <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'> <_sre.SRE_Match object; span=(0, 1), match='7'>
2、形如[0-9]被视为character class(字符组)或character set(字符集),用更具体的数字可以得到同样的结果,如[0123456789]。
[]被称为metacharacter(元字符),特征是:不参与匹配。
import re strs = ['770-827-7019', ] for x in strs: print(re.match(r'[0-9]', x)) print(re.match(r'[0123789]', x)) print(re.match(r'[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]', x)) print('\n') # output: # <_sre.SRE_Match object; span=(0, 1), match='7'> # <_sre.SRE_Match object; span=(0, 1), match='7'> # <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'>
3、在2中的[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]显然显得过于冗长,为了消除这种“冗长”,引入了character shorthand(字符简写式)例如可以用\d来完全替代[0-9],用\D来匹配所有非数字。
import re strs = ['770-827-7019', ] for x in strs: print(re.match(r'[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]', x)) # 原始形式 print(re.match(r'\d\d\d-\d\d\d-\d\d\d\d', x)) # 简写形式 print(re.match(r'\d\d\d\D\d\d\d\D\d\d\d\d', x)) print('\n') # output: # <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'> # <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'> # <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'>
4、用.匹配所有字符。
import re strs = ['770-827-7019', '770%827%7019', '770|827|7019'] for x in strs: print(re.match(r'\d\d\d.\d\d\d.\d\d\d\d', x)) # output: # <_sre.SRE_Match object; span=(0, 12), match='770-827-7019'> # <_sre.SRE_Match object; span=(0, 12), match='770%827%7019'> # <_sre.SRE_Match object; span=(0, 12), match='770|827|7019'>
5、capturing group(捕获分组)和backreference。例如(\d)\d\1,(\d)匹配第一个数字并将其“捕获”,\d匹配第二个数字而不“捕获”,\1用前面“捕获”的具体的数字“再次”进行匹配。例如下面的\1等价于数字“7”:
strs = ['.707', '.708'] for x in strs: print(re.match(r'\D(\d)\d\1', x)) # output: # <_sre.SRE_Match object; span=(0, 4), match='.707'> # None
6、quantifier(量词),让正则表达式更加简洁:{3,4} (3或4)、?(0或1)、+(1或多)、* (0或多)
重写匹配北美电话号码的正则(效果上等价于\d\d\d[.-]?\d\d\d[.-]?\d\d\d\d,但是形式上更为简洁):
strs = ['707-827-7019', '707-827-701'] for x in strs: print(re.match(r'(\d{3}[.-]?){2}\d{4}', x)) # output: # <_sre.SRE_Match object; span=(0, 12), match='707-827-7019'> # None
7、正则表达式在线测试:http://tool.chinaz.com/regex
刚开始不理解书上|后面的^,然后测试发现无论正则前面加多少个^都是不影响的(仍是匹配行首)。
源正则:^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$ (手动高亮),匹配北美电话,括号、区号都是可选的
8、在notepad++中使用正则表达式
9、为什么有那么多编写正则表达式的方法?