re模块——正则表达式

时间:2022-12-15 16:00:46
# re模块
# 对一个大篇幅的字符串指定按照一定的规则找出想要的字符串

import re
s1 = "好好学习 天天向上"
print(s1.find("天天"))  # 5
print(re.findall("天天", s1))  # ['天天']

# \w 匹配字母中文数字下划线
# \W 匹配特殊字符
print(re.findall("\w", "太白 123 ABC-- *%"))
# ['太', '白', '1', '2', '3', 'A', 'B', 'C']
print(re.findall("\w\w", "太白 123 ABC-- *%"))
# ['太白', '12', 'AB']

# \s \S
# \s 匹配任意的空白字符
# \S 匹配任意非空白字符
print(re.findall("\w", "太白 123\t\n"))
# ['太', '白', '1', '2', '3']
print(re.findall("\W", "太白 123\t\n"))
# [' ', '\t', '\n']

# \d 匹配数字
# \D 匹配非数字
print(re.findall("\d", "太白 123\t\n"))
# ['1', '2', '3']
print(re.findall("\D", "太白 123\t\n"))
# ['太', '白', ' ', '\t', '\n']

# \A ^ 两个都是匹配字符串的开始
print(re.findall("\A老", "老男孩 太白金星"))
# ['老']
print(re.findall("\A老男孩", "老男孩 太白金星"))
# ['老男孩']
print(re.findall("\A男孩", "老男孩 太白金星"))
# []
print(re.findall("^男孩", "老男孩 太白金星"))
# []
print(re.findall("^老男孩", "老男孩 太白金星"))
# ['老男孩']

# \Z $ 匹配字符串的结束
print(re.findall("金星$", "老男孩 太白金星"))
# ['金星']
print(re.findall("\$$", "老男孩 太白金星$"))
# ['$']
print(re.findall("金星\Z", "老男孩 太白金星"))
# ['金星']

# \n \t 匹配换行符 制表符
print(re.findall("\n", "\n dasd \n \n"))
# ['\n', '\n', '\n']
print(re.findall("\t", "\t dasd  \t\n \n"))
# ['\t', '\t']

 

# 重复匹配
# . ? * + {m, n} .* .*?

# . 这个点匹配任意字符
print(re.findall("a.b", "aabb"))
# 首先确定是要匹配三个字符
# 然后是三个字符三个字符找
# ['aab']

print(re.findall("a.b", "babb"))
# 先判断第一个字符是不是 a 开头,不是就跳到第二个判断,然后发现是 a 所以开始匹配
# ['abb']

print(re.findall("a.b", "abb a*b a1b a7b a+b a b a\nb a\tb"))
# ['abb', 'a*b', 'a1b', 'a7b', 'a+b', 'a b', 'a\tb']
print(re.findall("a.b", "abb a*b a1b a7b a+b a b a\nb", re.DOTALL))
# ['abb', 'a*b', 'a1b', 'a7b', 'a+b', 'a b', 'a\nb']

# ? 匹配0个或1个由左边字符定义的片段
print(re.findall("a?b", "ab"))
# ['ab']
# 这里涉及到贪婪匹配,虽然这里 b 前面有没有 a 都行,但是它就只匹配 ab ,不单独匹配 b
print(re.findall("a?b", "abbzab abb aab"))
# ['ab', 'b', 'ab', 'ab', 'b', 'ab']
# 注意上面提到的贪婪匹配

# * 匹配0个或多个左边字符表达式
print(re.findall("a*b", "b ab aaaaaab abbbbbb"))
# ['b', 'ab', 'aaaaaab', 'ab', 'b', 'b', 'b', 'b', 'b']

# + 匹配1个或多个左边字符表达式(至少1个)
print(re.findall("a+b", "b ab aaaaaab abb"))
# ['ab', 'aaaaaab', 'ab']

# {m, n} 匹配m个至n个左边字符表达式
print(re.findall("a{1,3}b", "aaab ab aab abbb aaz aabb"))  # 注意这里 {1,3} 中间不能由空格
# ['aaab', 'ab', 'aab', 'ab', 'aab']

 

# .* 贪婪匹配 从头到尾
print(re.findall("a.*b", "aab ab aaaaab a!!!%^&^%b"))
# 注意这里的匹配过程是直接从开头的 a 到结尾的 b 匹配就行,中间不管是什么
# ['aab ab aaaaab a!!!%^&^%b']

print(re.findall("a.*b", "aab ab aaaaab a!!!%^&^%bz"))
# 这里也是从开头的 a 匹配到倒数第二个字符 b,    z 不匹配
# ['aab ab aaaaab a!!!%^&^%b']

# .*? 非贪婪匹配 从头到尾
print(re.findall("a.*?b", "aab ab aaaaab a!!!%^&^%b"))
# 注意这里的 ? 是对前面 .* 的一个限定,而不是之前的 ? 的用法
# 这里跟贪婪的不一样, 它是一个一个来匹配看符不符合条件
# ['aab', 'ab', 'aaaaab', 'a!!!%^&^%b']

print(re.findall("a.*?b", "aab ab aaaaab a!!!%^&^%bz"))
# ['aab', 'ab', 'aaaaab', 'a!!!%^&^%b']

 

# [] 代表一个范围内的任意一个字符
print(re.findall("a[abc]b", "aab abb acb"))
# ['aab', 'abb', 'acb']
# 这里表示 a b 之间 只要有 abc 的任意一个字符都匹配

# 匹配数字
print(re.findall("a[0-9]b", "a1b a2b a3b  acb ayb"))
# ['a1b', 'a2b', 'a3b']

# 匹配小写字母
print(re.findall("a[a-z]b", "a1b a2b a3b  acb ayb"))
# ['acb', 'ayb']

# 匹配大写字母
print(re.findall("a[A-Z]b", "a1b a2b a3b aAb aBb acb ayb"))
# ['aAb', 'aBb']

# 匹配大小写字母
print(re.findall("a[a-zA-Z]b", "a1b a2b a3b aAb aBb acb ayb"))
# ['aAb', 'aBb', 'acb', 'ayb']

# 注意还是强调一点,一个[]代表一个字符
print(re.findall("a[0-9][0-9]", "a1b a9b a32b a788b"))

 

# print(re.findall("a[+-*%]", "a+b a-b a*b a%b a6b"))
# 注意这里的 [+-*%] 会飘红,因为 - 放在中间 Python会认为是范围符号,所以应该改为:
print(re.findall("a[-+*%]b", "a+b a-b a*b a%b a6b"))  # 把 - 放最前面
# ['a+b', 'a-b', 'a*b', 'a%b']

# () 指定一个规则,将满足规则的结果匹配出来
print(re.findall(".*?_sb", "他是_sb 日本_sb 美国_sb"))
# ['他是_sb', ' 日本_sb', ' 美国_sb']
print(re.findall("(.*?)_sb", "他是_sb 日本_sb 美国_sb"))
# 注意这里空格也有加进去,上面那个一样
# ['他是', ' 日本', ' 美国']

# \ 匹配
print(re.findall("我|中|ask", "我 中 中国 ask asjda"))
# ['我', '中', '中', 'ask']

# 注意下面两个的区别
print(re.findall('compan(y|ies)','companies have gone bankrupt, and my company'))  # ['ies', 'y']
# print(re.findall('company|companies)','Too many companies have gone bankrupt, and the next one is my company'))  #
print(re.findall('compan(?:y|ies)','companies have gone bankrupt, and company'))  # ['companies', 'company']

# search 找到第一个就返回
print(re.search("alex", "re alex alex"))
# <_sre.SRE_Match object; span=(3, 7), match='alex'>
print(re.search("alex", "re aex ex"))
# None
ret = re.search("alex", "re alex alex")
print(ret.group())  # alex

# search 总结
# 1.找到第一个就返回,返回的是一个对象,找不到就返回None
# 2.使用 对象.group() 可以将找到的第一个值取出来

 

# match 匹配字符串的开始
print(re.search("barry", "barryalksjlk").group())
# barry
print(re.match("barry", "barryalksjlk").group())
# barry
# 如果没有匹配到,不能用.group(),否则会报错
# print(re.match("barry", "arryalksjlk").group())

# split
s1 = "wusir;李白;alex; 日天"
print(s1.split(";"))
# ['wusir', '李白;alex', ' 日天']
print(s1.replace(";", "").split(""))
# ['wusir', '李白', 'alex', ' 日天']

s2 = "wusir;李白,alex|日天!小虎"
print(re.split("[;,|!]", s2))
# ['wusir', '李白', 'alex', '日天', '小虎']

 

# sub 替换
print(re.sub('barry', '太白', 'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。'))
# 太白是最好的讲师,太白就是一个普通老师,请不要将太白当男神对待。
print(re.sub('barry', '太白', 'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。',2))
# 太白是最好的讲师,太白就是一个普通老师,请不要将barry当男神对待。

print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)', r'\1\2\3\4\5', r'alex is sb'))
# ^在中括号中是取反
# alex is sb
print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)', r'\5\2\3\4\1', r'alex is sb'))
# sb is alex

# compile
obj = re.compile("\d{2}")
print(obj.findall("fdsafsda1243fdsdf324"))
# ['12', '43', '32']

 

# finditer
ret = re.finditer("\d", "dsjk3ska342a")
print(next(ret).group())  # 3
print(next(ret).group())  # 3
print(next(ret).group())  # 4
print(next(ret).group())  # 2

# print([i.group for i in ret])


s3 = '深圳电话:0755-546123546 深圳地址:广东..'
ret = re.search("\d+-\d+", s3)
print(ret.group())  # 0755-546123546

# 命名分组  ?P<组名>
ret = re.search("(?P<quhao>\d+)-(?P<number>\d+)", s3)
print(ret.group("quhao"))  # 0755
print(ret.group("number"))  # 546123546

# 取出 192.168.6.11
s4 = "ip='192.168.6.11', version:1.0.0"
# 方法一
print(re.search("ip='\d+\.\d+\.\d+\.\d+'", s4).group())
# ip='192.168.6.11'

# 方法二
ret = re.search("(?P<ip>\d+\.\d+\.\d+\.\d+)", s4)
print(ret.group("ip"))  # 192.168.6.11