一. 正则表达式
- 匹配次数:
+:前面模式匹配一次或多次,>=1。
?:前面模式匹配零次或一次,=0 or =1。
*:前面模式匹配零次或多次,>=0。
{min,max}:前面模式匹配具体次数。>=min and <=max,min和max都可以省略表示不限定最小最大值。min和max之间只能有一个逗号,加个空格就不行了,比如{min, max}就不行(写其他语言习惯性加空格了)。
-
使用()进行分组,供match object group()与groups()使用:
-
使用 | 选择其一,返回值为第一个匹配到的。
-
反斜杠加字符组成特殊字符
\d:匹配数字0-9,相当于[0-9]。
\D:匹配除了数字0-9之外的其他字符,相当于[^0-9]。
\w:匹配字母、数字、下划线,相当于[0-9a-zA-Z_]。
\W:匹配除了字母数字下划线外的其他字符,相当于[^0-9a-zA-Z_]。
\s:匹配空格、\t、\n,只要是空白就可以匹配。
\S:除了空格、\t、\n之外的其他字符。
总之大写就是小写的对立面,我认为可以看作取反操作。
- 使用 [] 方括号匹配其中指定字符:
方括号中普通正则表达式失效,如*?等就表示本身,没有其他含义。
方括号内可以使用 ^ 来表示除了方括号中其他元素之外的字符,[^0-9]表示除了0-9之外的字符。
方括号内可以使用 - 来表示一个范围,[a-z]表示所有小写字母。
- 可以使用 ?选择非贪婪匹配
贪婪匹配尽可能多的找,非贪婪匹配尽可能少的找。
*?、{min,max}?、+?都表示前面的进行非贪婪匹配。
-
使用 ^ $匹配行首行尾
-
使用 . 匹配除换行符之外的任何字符
二. 使用re
- 使用compile产生一个正则对象,称为pattern object:
compile可以传入第二个参数:
re.DOTALL:. 符号代表所有符号,包括换行符。
re.I:忽略大小写。
…
import re
pattern_object = re.compile(r"\w+", re.I | re.DOTALL)
- pattern object的方法:
search(): 如果找不到返回None,找到返回一个对象,在此称为match object。
pattern_object = re.compile(r"[a-z]+")
#如果匹配到就返回一个match object,没有匹配到就返回None
match_object_1 = pattern_object.search("777777") #未匹配,返回None
match_object_2 = pattern_object.search("sanshi") #返回match object
findall():
如果正则表达式没有()分组:返回列表,每个元素为字符串。
如果正则表达式有()分组:返回列表,每个元素为元组。
pattern_object_1 = re.compile(r"[a-z]+")
str_list = pattern_object_1.findall("san777shi")#['san','shi']
pattern_object_2 = re.compile(r"([a-z])([a-z])([a-z])")
tuple_list = pattern_object_2.findall("san777shi")#[('s','a','n'),('s','h','i')]
sub():
第二个参数中匹配到的部分替换为第一个参数。
pattern_object = re.compile(r"[a-z]+")
str_tmp = pattern_object.sub('xxx', 'sanshi777') #替换后为xxx777
- match object的方法:
group():match object(请见使用re部分)调用group方法时:
参数为0或者没有:整个匹配的文本。
参数为具体数字:打印数字对应的小括号中的文本。
groups():match object调用groups方法时,返回值为匹配到的值构成元组。
pattern_object = re.compile(r"([a-z]+)([0-9]+)")
match_object = pattern_object.search("sanshi777")
print(match_object.group()) #sanshi777. same to match_object.group(0)
print(match_object.group(1)) #sanshi
print(match_object.group(2)) #777
#print(match_object.group(3)) error,没有3
print(match_object.groups()) #('sanshi', '777')