import re
一、正则表达式就是在文本中,查找符合 模式字符串的 子字符串。
. 表示匹配任意一个有效字符
\w 表示匹配一个有效字符(任何字母 数字 _)
\W 表示匹配一个非有效字符
\d 表示匹配一个数字字符
\D 表示匹配一个非数字字符
\s 表示匹配一个空格字符
\S 表示匹配一个非空格字符
[] 表示匹配一个符合中括号中范围的字符
[^] 表示匹配一个不符合中括号中范围的字符
s = "我今年18岁, 我喜欢6岁那年的夏天,hello"
search 只返回第一个符合模式的结果
result = re.search("[^a-zA-Z]", s)
print("search的结果", result)
findall 返回所有符合模式字符串的结果
result = re.findall("[^a-zA-Z]", s)
print("findall的结果", result)
二、表示长度的模式字: 他会修饰前一个字符,表示前一个字符出现的次数
? 出现0次或者出现1次 [0,1]
* 出现0次或者多次[0,无穷]
+ 出现1次或者多次[1,无穷]
{m,n} 出现m次或者n次[m,n]
{m,} 出现至少m次 [m,无穷]
{,n} 出现至多n次 [0,n]
{m} 出现m次 [m]
s = "我今年18岁, 我喜欢6岁那年的夏天,我的电话号码是18812345678"
正则表达式默认情况下是贪婪模式:匹配结果是尽可能多的字符
懒惰模式:匹配结果是尽可能少的字符?如果出现在表示长度的模式字之后,贪婪模式就会被切换为懒惰模式
result = re.search("https?", s) 字符s可以有也可以没有
print("search的结果", result)
result = re.findall("\d+?", s) 匹配一个至少有一位的数字
print("search的结果", result)
匹配正则语法中包含那些符号
s = r"我今年18岁...\我喜欢6岁那年的夏天,\我的电话号码是18812345678"
result = re.findall(r"\\", s) # 匹配一个至少有一位的数字
print("search的结果", result)
三、表示边界匹配的符号
^ 表示的从字符串头开始匹配
$ 表示匹配字符串的尾
\b 表示单词的边界匹配:非字母字符将两段字母字符串隔开,例如:"i am,your teacher.i am so happy!"
s = r"我今年18岁...我喜欢6岁那年的夏天,我的电话号码是18812345678"
result = re.findall(r"^我", s)
print(result)
result = re.findall(r"\d+$", s)
print(result)
整则现在,在一篇文章中匹配其中的手机号码
\d{11}
分组 :
1.使用效果将多种匹配写在一个分组中,匹配之间使用 | 进行分割
s1 = "https://www.baidu.com"
s2 = "http://www.baidu.com"
result = re.search(r"https?.*", s1)
print(result)
result = re.search(r"https?.*", s2)
print(result)
result = re.search(r"(http:.*|https:.*)", s1)
print(result)
result = re.search(r"(http:.*|https:.*|)", s2)
print(result)
2.提取子串
在正则表达式中如果要引用分组中正则表达式,无需重复书写直接\数字 即可应用该数字对应的分组
s1 = "<https<://www.baidu.com"
s2 = "http://www.baidu.com"
result = re.search("(https?://)(.*)", s1)
print(result)
print(result.group(1))
print(result.group(2))