写在前面
代码基于的python版本:python3.6
一、^ $ * ? + {2} {2,} {2,5} |
1、基本解释
注意:下面匹配模式中x可使用任意字符代替。
^x:表示字符串需要以“x”开头。
x$:代表结尾字符必须是x。
*:代表前面的字符可以重复任意多次,也可以出现0次,即≥0次。
?x:表示对x进行非贪婪匹配,即遇到第一个x即进入匹配模式中。
x+:表示x至少出现一次,即≥1次。
注意:下面匹配模式中m,n需要是数字。
x{m}:表示x字符出现m次。
x{m,}:表示x字符出现m次或m次以上。
x{m, n}:表示x字符出现的次数是m~n次(包含m和n)。
|:或,|的两边的字符都满足要求。
2、示例
示例1:已知字符串:“naaaanaa123”,判断此字符串是否以“n”开头,中间可以跟多个任意字符,最后以“3”结尾。
import re
line = "naaaanaa123"
regex_str = "^n.*3$" # 字符串以n开头,中间可以跟多个任意字符,最后以3结尾
if re.match(regex_str, line):
print("yes") # 输出结果为yes
示例2:已知字符串:“naaaanaa123”,提取出第一次出现的“n”和第二次出现的“n”之间的字符串。
import re
line = "naaaanaa123" # 需求是将第一次和第二次出现的两个n中间的字符串提取出来
regex_str = ".*(n.*n)(.*)" # 字符串匹配模式:最开始可以是多个任意字符,接着出现n,再接着可以是多个任意字符,接着是n,最后也是多个任意字符,提取的内容是括号中的内容
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #提取括号内结果的字符串,group(1)表示只取第1个括号内的内容,输出结果:naaaan
print(match_obj.group(2)) # 提取括号内结果的字符串,group(1)表示只取第2个括号内的内容,输出结果:aa123
示例3:“?”的用法。已知字符串:“naaaannaa123”,若仍然使用regex_str = “.*(n.*n).*” 这种匹配模式,结果是“nn”(这是因为正则表达式的贪婪匹配,即从模式匹配字符串的最后开始匹配,首先匹配.*,即“aa123”,接着遇到“n”,中间不管是出现很多字符还是没有出现,又遇到了下一个字符“n”,因此符合(n.*n),因此括号内的匹配结果是“nn”)。因此需要使用“?”,如下面代码所示:
import re
line = "naaaannaa123" # 需求是将第一次和第二次出现的两个n中间的字符串提取出来
regex_str = ".*?(n.*n).*" # 字符串匹配模式:限定"?",说明开启非贪婪匹配模式,即从左边开始,遇到第一个n,即进入匹配模式,而不需要等到最后一个
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:naaaann
上述这种模式虽然把“naaaan”输出了,但是后面的“nn”也被输出,这并不是我们想要的,这是因为我们只设置了模式匹配中的第一个“n”是非贪婪模式,但是第二个n现在仍然是贪婪模式,因此也需要在在第二个“n”之前加上“?”将其设置为非贪婪模式。代码如下:
import re
line = "naaaannaa123" # 需求是将第一次和第二次出现的两个n中间的字符串提取出来
regex_str = ".*?(n.*?n).*" # 字符串匹配模式:在"n"的前面都限定"?",表示对两个"n"都开启非贪婪模式
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:naaaan
示例4:利用+,使用贪婪匹配,输出相应的结果。
import re
line = "naaaananaa123"
regex_str = ".*(n.+n).*" # 贪婪匹配,即从后往前开始匹配,第一次出现n,然后前面是至少一个任意字符,接着再是n
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:nan
示例5:{1}表示必须出现1次。
import re
line = "naaaananaa123"
regex_str = ".*(n.{1}n).*"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:nan
示例6:“|”的使用
第一个例子是完全字符匹配,不固定某一部分内容:
import re
line = "naana123"
regex_str = "(naana|naana123)" # 匹配naana或者naana123,优先匹配前面的,即优先匹配naana,若line字符串中出现naana,则返回naana
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:naana
第2个例子是固定某一部分内容,只对其中一部分字符匹配:
import re
line = "naana123"
regex_str = "(nana|naana)123" # 后面的数字固定,只针对前面的字符进行匹配
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:naana
示例7:括号的用法
import re
line = "naana123"
regex_str = "((nana|naana)123)" # 后面的数字固定,只针对前面的字符进行匹配
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:naana123
print(match_obj.group(2)) # 输出结果:naana
二、[] [^] [a-z] .
1、基本解释
注意:下面匹配模式中x可使用任意字符代替。
强调:进入[ ]中的字符就是字符本身,已经没有其他特殊的含义,比如,.和*只能表示.和*,不能再表示任意字符。
[xyz]:表示出现x、y、z都可以。
[^x] :中括号的取非操作,字符不能为x。
[a-z] :表示范围,即a-z的任一字符都可以。
.:只任意字符,包括所有的字符、制表符等所有。
2、示例
示例1:[ ]的第1个用途,表示可以是[ ]中的任一字符。
import re
line = "naana123"
regex_str = "([mnpq]aana123)" # 第一个字符是m、n、p和q中的任一字符都可以
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:naana123
示例2:[ ]的第2个用途:[^x]表示取非操作,即字符不能为x。
import re
line = "1563aa69842"
regex_str = "(1[45689][^1]{9})" #[0-9]{9}表示0-9之间任意一个字符都可以,出现9次
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:1563aa69842
示例3:[ ]的第3个用途,数据满足[ ]中的区间即可:
import re
line = "15635269842"
regex_str = "(1[45689][0-9]{9})" #[0-9]{9}表示0-9之间任意一个字符都可以,出现9次
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:15635269842
三、\s \S \w \W
1、基本解释
\s:表示空格。
\S:表示只要不是空格都可以。
\w:表示:A-Z、a-z、0-9和_之间的任意字符都可以。
\W:表示\w的取反操作,即不能为A-Z、a-z、0-9和_之间的任意字符。
2、示例
示例1:\s的作用
import re
line = "你 好"
regex_str = "(你\s好)" # 模式表示“你”和“好”之间需要有空格
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:你 好
示例2: \S的作用
import re
line = "你真好"
regex_str = "(你\S好)" # 若是想匹配“你真的很好”,即“你”和“好”之间有多个字符,则需要使用“(你\S+好)”
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:你真好
示例3:\w的作用
import re
line = "你S_好"
regex_str = "(你\w+好)"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:你S_好
四、[\u4E00-\u9FA5] () \d
1、基本解释
[\u4E00-\u9FA5]:这是Unicode编码,表示任意汉字都可以。
\d:表示数字的意思。
2、示例
示例1:[\u4E00-\u9FA5]的作用
import re
line = "你*好"
regex_str = "([\u4E00-\u9FA5]+)"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:你
import re
line = "study in 清华大学"
regex_str = ".*?([\u4E00-\u9FA5]+大学)" # 若不加?,则是贪婪匹配,从后往前返回一个汉字,结果为“华大学”
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:清华大学
示例2:\d的使用
import re
line = "张三出生于1998年"
regex_str = ".*?(\d+)年" # 加?取消贪婪模式,或者使用(\d{4})
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1)) #输出结果:1998