• wupeiqi 匹配文本中的wupeiqi ```python import re

text = “你好wupeiqi,阿斯顿发wupeiqasd 阿士大夫能接受的wupeiqiff” data_list = re.findall(“wupeiqi”, text) print(data_list) # [‘wupeiqi’, ‘wupeiqi’] 可用于计算字符串中某个字符出现的次数

  1. - `[abc]` 匹配abc 字符。
  2. ```python
  3. import re
  4. text = "你2b好wupeiqi,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqaceiqiff"
  5. data_list = re.findall("[abc]", text)
  6. print(data_list) # ['b', 'a', 'a', 'a', 'b', 'b', 'c']
  1. import re
  2. text = "你2b好wupeiqi,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqcceiqiff"
  3. data_list = re.findall("q[abc]", text)
  4. print(data_list) # ['qa', 'qc']
  • [^abc] 匹配除了abc意外的其他字符。 ```python import re

text = “你wffbbupceiqiff” data_list = re.findall(“[^abc]”, text) print(data_list) # [‘你’, ‘w’, ‘f’, ‘f’, ‘u’, ‘p’, ‘e’, ‘i’, ‘q’, ‘i’, ‘f’, ‘f’]

  1. - `[a-z]` 匹配a~z的任意字符( [0-9]也可以 )。
  2. ```python
  3. import re
  4. text = "alexrootrootadmin"
  5. data_list = re.findall("t[a-z]", text)
  6. print(data_list) # ['tr', 'ta']
  • . 代指除换行符以外的任意字符。 ```python import re

text = “alexraotrootadmin” data_list = re.findall(“r.o”, text) print(data_list) # [‘rao’, ‘roo’]

  1. ```python
  2. import re
  3. text = "alexraotrootadmin"
  4. data_list = re.findall("r.+o", text) # 贪婪匹配
  5. print(data_list) # ['raotroo']
  1. import re
  2. text = "alexraotrootadmin"
  3. data_list = re.findall("r.+?o", text) # 非贪婪匹配
  4. print(data_list) # ['rao']
  • \w 代指字母或数字或下划线(汉字)。 ```python import re

text = “北京武沛alex齐北 京武沛alex齐” data_list = re.findall(“武\w+x”, text) print(data_list) # [‘武沛alex’, ‘武沛alex’]

  1. - `\d` 代指数字
  2. ```python
  3. import re
  4. text = "root-ad32min-add3-admd1in"
  5. data_list = re.findall("d\d", text)
  6. print(data_list) # ['d3', 'd3', 'd1']
  1. import re
  2. text = "root-ad32min-add3-admd1in"
  3. data_list = re.findall("d\d+", text)
  4. print(data_list) # ['d32', 'd3', 'd1']
  • \s 代指任意的空白符,包括空格、制表符等。 ```python import re

text = “root admin add admin” data_list = re.findall(“a\w+\s\w+”, text) print(data_list) # [‘admin add’]

  1. <a name="58478f84"></a>
  2. ##### 2. 数量相关
  3. - `*` 重复0次或更多次
  4. ```python
  5. import re
  6. text = "他是大B个,确实是个大2B。"
  7. data_list = re.findall("大2*B", text)
  8. print(data_list) # ['大B', '大2B']
  • + 重复1次或更多次 ```python import re

text = “他是大B个,确实是个大2B,大3B,大66666B。” data_list = re.findall(“大\d+B”, text) print(data_list) # [‘大2B’, ‘大3B’, ‘大66666B’]

  1. - `?` 重复0次或1
  2. ```python
  3. import re
  4. text = "他是大B个,确实是个大2B,大3B,大66666B。"
  5. data_list = re.findall("大\d?B", text)
  6. print(data_list) # ['大B', '大2B', '大3B']
  • {n} 重复n次 ```python import re

text = “楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀” data_list = re.findall(“151312\d{5}”, text) print(data_list) # [‘15131255789’]

  1. - `{n,}` 重复n次或更多次
  2. ```python
  3. import re
  4. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
  5. data_list = re.findall("\d{9,}", text)
  6. print(data_list) # ['442662578', '15131255789']
  • {n,m} 重复n到m次 ```python import re

text = “楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀” data_list = re.findall(“\d{10,15}”, text) print(data_list) # [‘15131255789’]

  1. <a name="01c12fca"></a>
  2. ##### 3. 括号(分组)
  3. - 提取数据区域
  4. ```python
  5. import re
  6. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
  7. data_list = re.findall("15131(2\d{5})", text)
  8. print(data_list) # ['255789']
  1. import re
  2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来15131266666呀"
  3. data_list = re.findall("15(13)1(2\d{5})", text)
  4. print(data_list) # [ ('13', '255789') ]
  1. import re
  2. text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
  3. data_list = re.findall("(15131(2\d{5}))", text)
  4. print(data_list) # [('15131255789', '255789')]
  • 获取指定区域 + 或条件 ```python import re

text = “楼主15131root太牛15131alex逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀” data_list = re.findall(“15131(2\d{5}|r\w+太)”, text) print(data_list) # [‘root太’, ‘255789’]

  1. ```python
  2. import re
  3. text = "楼主15131root太牛15131alex逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
  4. data_list = re.findall("(15131(2\d{5}|r\w+太))", text)
  5. print(data_list) # [('15131root太', 'root太'), ('15131255789', '255789')]

4. 起始和结束

上述示例中都是去一段文本中提取数据,只要文本中存在即可。

但,如果要求用户输入的内容必须是指定的内容开头和结尾,比就需要用到如下两个字符。

  • ^ 开始
  • $ 结束
  1. import re
  2. text = "啊442662578@qq.com我靠"
  3. email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
  4. print(email_list) # []
  1. import re
  2. text = "442662578@qq.com"
  3. email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
  4. print(email_list) # ['442662578@qq.com']

这种一般用于对用户输入数据格式的校验比较多,例如:

  1. import re
  2. text = input("请输入邮箱:")
  3. email = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
  4. if not email:
  5. print("邮箱格式错误")
  6. else:
  7. print(email)

5. 特殊字符

由于正则表达式中 * . \ { } ( ) 等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义,例如:

  1. import re
  2. text = "我是你{5}爸爸"
  3. data = re.findall("你{5}爸", text)
  4. print(data) # []
  1. import re
  2. text = "我是你{5}爸爸"
  3. data = re.findall("你\{5\}爸", text)
  4. print(data)

1.3.2 re模块

python中提供了re模块,可以处理正则表达式并对文本进行处理。

  • findall,获取匹配到的所有数据 ```python import re

text = “dsf130429191912015219k13042919591219521Xkk” data_list = re.findall(“(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)”, text) print(data_list) # [(‘130429’, ‘1919’, ‘12’, ‘01’, ‘521’, ‘9’), (‘130429’, ‘1959’, ‘12’, ‘19’, ‘521’, ‘X’)]

  1. - match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
  2. ```python
  3. import re
  4. text = "大小逗2B最逗3B欢乐"
  5. data = re.match("逗\dB", text)
  6. print(data) # None
  1. import re
  2. text = "逗2B最逗3B欢乐"
  3. data = re.match("逗\dB", text)
  4. if data:
  5. content = data.group() # "逗2B"
  6. print(content)
  • search,浏览整个字符串去匹配第一个,未匹配成功返回None ```python import re

text = “大小逗2B最逗3B欢乐” data = re.search(“逗\dB”, text) if data: print(data.group()) # “逗2B”

  1. - sub,替换匹配成功的位置
  2. ```python
  3. import re
  4. text = "逗2B最逗3B欢乐"
  5. data = re.sub("\dB", "沙雕", text)
  6. print(data) # 逗沙雕最逗沙雕欢乐
  1. import re
  2. text = "逗2B最逗3B欢乐"
  3. data = re.sub("\dB", "沙雕", text, 1)
  4. print(data) # 逗沙雕最逗3B欢乐
  • split,根据匹配成功的位置分割 ```python import re

text = “逗2B最逗3B欢乐” data = re.split(“\dB”, text) print(data) # [‘逗’, ‘最逗’, ‘欢乐’]

  1. ```python
  2. import re
  3. text = "逗2B最逗3B欢乐"
  4. data = re.split("\dB", text, 1)
  5. print(data) # ['逗', '最逗3B欢乐']
  • finditer ```python import re

text = “逗2B最逗3B欢乐” data = re.finditer(“\dB”, text) for item in data: print(item.group())

  1. ```python
  2. import re
  3. text = "逗2B最逗3B欢乐"
  4. data = re.finditer("(?P<xx>\dB)", text) # 命名分组
  5. for item in data:
  6. print(item.groupdict())
  1. text = "dsf130429191912015219k13042919591219521Xkk"
  2. data_list = re.finditer("\d{6}(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}[\d|X]", text)
  3. for item in data_list:
  4. info_dict = item.groupdict()
  5. print(info_dict)