在python中,可以用string.startwith()、string.endswith()、if string in sentence等等进行字符匹配,但能完成的匹配有限,
正则表达式是用来完成精确匹配的一种机制
在各种语言中通用
正则表达式能够更有效的处理字符串方法处理起来很复杂的匹配
——书籍《正则指引》Python写的
-
规则
-
[]表示一个位置,[123]表示这一个位置或1或2或3
-
[0123456789] [0-9] [a-z] [0-9a-fA-F] 必须是-前大,-后小
-
元字符——就是在正则表达式中有特殊的意义
元字符 匹配内容 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线 \s 匹配任意的空白符 \d 匹配数字 \n 匹配一个换行符 \t 匹配一个制表符 \b 匹配一个单词的结尾 ^ 匹配字符串的开始 $ 匹配字符串的结尾 \W 匹配非字母或数字或下划线 \D 匹配非数字 \S 匹配非空白符 -
重复匹配
- *? 重复任意次,但尽可能少重复
- +? 重复1次或更多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
- {n,m}? 重复n到m次,但尽可能少重复
- {n,}? 重复n次以上,但尽可能少重复
-
.*?
- 只对前面紧跟的一个字符起作用
- . 是任意字符
- 是取 0 至 无限长度(贪婪匹配,尽可能多的匹配)
- ? 是非贪婪模式(尽可能短的匹配)
- 合在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在 .*?x 就是取前面任意长度的字符,直到一个x出现
-
分组匹配
() 在总的匹配串中获得其中的部分内容
-
-
方法
-
search(restr, string),在string中匹配符合restr的部分;返回一个re内部的对象
search(restr, string).group(),获得匹配命中的字符子串
#----------------- 直接匹配 pattern1 = "cat" # 匹配其中的cat pattern2 = "bird" string = "dog runs to cat" print(re.search(pattern1, string)) # <_sre.SRE_Match object; span=(12, 15), match='cat'> print(re.search(pattern1, string).group()) # cat print(re.search(pattern2, string)) # None #------------------ 拼接匹配 ptn3 = r"r[au]n" # 匹配 ("run" or "ran") ptn4 = r'r[a-c]n' # 匹配ran、rbn、rcn print(re.search(ptn3, "dog runs to cat")) # <_sre.SRE_Match object; span=(4, 7), match='run'> print(re.search(ptn4, "dog runs to cat")) # None #------------------- 元字符 print(re.search(r"r\dn", "run r4n")) # \d匹配一位数字 # <_sre.SRE_Match object; span=(4, 7), match='r4n'> print(re.search(r"r\Dn", "run r4n")) # \D匹配一位非数字 # <_sre.SRE_Match object; span=(0, 3), match='run'> #------------------- 多行匹配 string = ''' dog runs to cat. I run to dog. ''' print(re.search(r"^I", string)) # None print(re.search(r"^I", string, flags=re.M)) # 通过指定flags属性为re.M可以在多行进行匹配 # <_sre.SRE_Match object; span=(18, 19), match='I'> #-------------------- 重复匹配 # * : 重复零次或多次 # + : 重复一次或多次 # {n, m} : 重复 n 至 m 次 # {n} : 重复 n 次 # *:匹配0次或多次,尽可能多的匹配 print(re.search(r"ab*", "a")) # 允许0个b # <_sre.SRE_Match object; span=(0, 1), match='a'> print(re.search(r"ab*", "abbbbb")) # *对b起作用,即0或多个b,尽可能多的匹配 # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'> # + : 匹配1次或多次,尽可能多匹配 print(re.search(r"ab+", "a")) # 要求至少有1个b # None print(re.search(r"ab+", "abbbbb")) # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'> # {n, m} : 匹配n-m次,尽可能多匹配 print(re.search(r"ab{2,10}", "a")) # None print(re.search(r"ab{2,10}", "abbbbbabb")) # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'> #------------------- 分组匹配 # 通过在小括号()中一部分匹配规则,这样可以在匹配结果中通过索引单独提取这部分结果 match = re.search(r"(\d+), Date: (.+)", "ID: 021523, Date: Feb/12/2017") print(match.group()) # 获取整个匹配结果 # 021523, Date: Feb/12/2017 print(match.group(1)) # 提取索引1的结果(第1个括号),索引从1开始 # 021523 print(match.group(2)) # 提取索引2的结果(第2个括号) # Date: Feb/12/2017 # 通过?P<名称>可以为匹配结果指定key/名称/属性索引,可以在结果中通过这么名称访问分组匹配结果 match = re.search(r"(?P<id>\d+), Date: (?P<date>.+)", "ID: 021523, Date: Feb/12/2017") print(match.group('id')) # 021523 print(match.group('date')) # Date: Feb/12/2017
- re.findall(restr,string),返回string中所有匹配restr的结果列表
print(re.findall(r"r[ua]n", "run ran ren")) # ['run', 'ran']
- | : or 匹配xx或者XX
print(re.findall(r"(run|ran)", "run ran ren")) # ['run', 'ran']
- re.sub(restr,replacestr,string) 匹配并替换string中的restr为replacestr
print(re.sub(r"r[au]ns", "catches", "dog runs to cat")) # dog catches to cat
- re.split(restr, string) 按restr对string进行分割,返回分割后的列表
print(re.split(r'[,;\.]', 'a;b,c.d;e')) # 按匹配到的字符进行分割 # ['a', 'b', 'c', 'd', 'e']
- re.compile(restr) 将正则表达式封装进compile对象
compiled_re = re.compile(r"r[ua]n") # 把正则规则封装进一个正则对象 print(compiled_re.search("dog ran to cat")) # 在字符串上应用正则对象 # <_sre.SRE_Match object; span=(4, 7), match='ran'>
-
-
查询文档
- 参考文献
程序主要来自 Python正则表达式指南,略有改动
python之路——常用模块