当给你一大堆文本信息,让你提取其中的指定数据时,可以使用正则来实现。例如:提取文本中的邮箱和手机号
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
-
- phone_list = re.findall("1[3|5|8|9]\d{9}", text)
- print(phone_list)
-
- import re
-
- text = "你好wupeiqi,阿斯顿发wupeiqasd 阿士大夫能接受的wupeiqiff"
- data_list = re.findall("wupeiqi", text)
- print(data_list) # ['wupeiqi', 'wupeiqi'] 可用于计算字符串中某个字符出现的次数
-
- import re
-
- text = "你2b好wupeiqi,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqaceiqiff"
- data_list = re.findall("[abc]", text)
- print(data_list) # ['b', 'a', 'a', 'a', 'b', 'b', 'c']
-
- import re
-
- text = "你2b好wupeiqi,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqcceiqiff"
- data_list = re.findall("q[abc]", text)
- print(data_list) # ['qa', 'qc']
-
- import re
-
- text = "你wffbbupceiqiff"
- data_list = re.findall("[^abc]", text)
- print(data_list) # ['你', 'w', 'f', 'f', 'u', 'p', 'e', 'i', 'q', 'i', 'f', 'f']
-
- import re
-
- text = "alexrootrootadmin"
- data_list = re.findall("t[a-z]", text)
- print(data_list) # ['tr', 'ta']
-
- import re
-
- text = "alexraotrootadmin"
- data_list = re.findall("r.o", text)
- print(data_list) # ['rao', 'roo']
-
- import re
-
- text = "alexraotrootadmin"
- data_list = re.findall("r.+o", text) # 贪婪匹配
- print(data_list) # ['raotroo']
-
- import re
-
- text = "alexraotrootadmin"
- data_list = re.findall("r.+?o", text) # 非贪婪匹配
- print(data_list) # ['rao']
-
- import re
-
- text = "北京武沛alex齐北 京武沛alex齐"
- data_list = re.findall("武\w+x", text)
- print(data_list) # ['武沛alex', '武沛alex']
-
- import re
-
- text = "root-ad32min-add3-admd1in"
- data_list = re.findall("d\d", text)
- print(data_list) # ['d3', 'd3', 'd1']
-
- import re
-
- text = "root-ad32min-add3-admd1in"
- data_list = re.findall("d\d+", text)
- print(data_list) # ['d32', 'd3', 'd1']
-
- import re
-
- text = "root admin add admin"
- data_list = re.findall("a\w+\s\w+", text)
- print(data_list) # ['admin add']
-
- import re
-
- text = "他是大B个,确实是个大2B。"
- data_list = re.findall("大2*B", text)
- print(data_list) # ['大B', '大2B']
-
- import re
-
- text = "他是大B个,确实是个大2B,大3B,大66666B。"
- data_list = re.findall("大\d+B", text)
- print(data_list) # ['大2B', '大3B', '大66666B']
-
- import re
-
- text = "他是大B个,确实是个大2B,大3B,大66666B。"
- data_list = re.findall("大\d?B", text)
- print(data_list) # ['大B', '大2B', '大3B']
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- data_list = re.findall("151312\d{5}", text)
- print(data_list) # ['15131255789']
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- data_list = re.findall("\d{9,}", text)
- print(data_list) # ['442662578', '15131255789']
-
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- data_list = re.findall("\d{10,15}", text)
- print(data_list) # ['15131255789']
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- data_list = re.findall("15131(2\d{5})", text)
- print(data_list) # ['255789']
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来15131266666呀"
- data_list = re.findall("15(13)1(2\d{5})", text)
- print(data_list) # [ ('13', '255789') ]
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- data_list = re.findall("(15131(2\d{5}))", text)
- print(data_list) # [('15131255789', '255789')]
-
- 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']
-
- 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) # [('15131root太', 'root太'), ('15131255789', '255789')]
-
- [1-9]\d{4,}
-
- import re
-
- text = "dsf130429191912015219k13042919591219521Xkk"
- data_list = re.findall("\d{17}[\dX]", text) # [abc]
- print(data_list) # ['130429191912015219', '13042919591219521X']
-
- import re
-
- text = "dsf130429191912015219k13042919591219521Xkk"
- data_list = re.findall("\d{17}(\d|X)", text)
- print(data_list) # ['9', 'X']
-
- import re
-
- text = "dsf130429191912015219k13042919591219521Xkk"
- data_list = re.findall("(\d{17}(\d|X))", text)
- print(data_list) # [('130429191912015219', '9'), ('13042919591219521X', 'X')]
-
- 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')]
-
- import re
-
- text = "我的手机哈是15133377892,你的手机号是1171123啊?"
- data_list = re.findall("1[3-9]\d{9}", text)
- print(data_list) # ['15133377892']
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- email_list = re.findall("\w+@\w+\.\w+",text)
- print(email_list) # ['442662578@qq.com和xxxxx']
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- email_list = re.findall("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+", text, re.ASCII)
- print(email_list) # ['442662578@qq.com', 'xxxxx@live.com']
-
-
- import re
-
- text = "楼主太牛逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- email_list = re.findall("\w+@\w+\.\w+", text, re.ASCII)
- print(email_list) # ['442662578@qq.com', 'xxxxx@live.com']
-
- import re
-
- text = "楼主太牛44266-2578@qq.com逼了,在线想要 442662578@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀"
- email_list = re.findall("(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)", text, re.ASCII)
- print(email_list) # [('44266-2578@qq.com', '-2578', '', ''), ('xxxxx@live.com', '', '', '')]
-
- # 先安装两个模块
- pip3 install requests
- pip3 install beautifulsoup4
-
- import re
- import requests
- from bs4 import BeautifulSoup
-
- res = requests.get(
- url="https://www.douban.com/group/topic/79870081/",
- headers={
- 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
- }
- )
- bs_object = BeautifulSoup(res.text, "html.parser")
- comment_object_list = bs_object.find_all("p", attrs={"class": "reply-content"})
- for comment_object in comment_object_list:
- text = comment_object.text
- print(text)
- # 请继续补充代码,提取text中的邮箱地址
-
-
上述示例中都是去一段文本中提取数据,只要文本中存在即可。
但,如果要求用户输入的内容必须是指定的内容开头和结尾,比就需要用到如下两个字符。
- import re
-
- text = "啊442662578@qq.com我靠"
- email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
- print(email_list) # []
-
- import re
-
- text = "442662578@qq.com"
- email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
- print(email_list) # ['442662578@qq.com']
-
这种一般用于对用户输入数据格式的校验比较多,例如:
- import re
-
- text = input("请输入邮箱:")
- email = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
- if not email:
- print("邮箱格式错误")
- else:
- print(email)
-
由于正则表达式中* . \ { } ( )等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义,例如:
- import re
-
- text = "我是你{5}爸爸"
- data = re.findall("你{5}爸", text)
- print(data) # []
-
- import re
-
- text = "我是你{5}爸爸"
- data = re.findall("你\{5\}爸", text)
- print(data)
-
python中提供了re模块,可以处理正则表达式并对文本进行处理。
- 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')]
-
- import re
-
- text = "大小逗2B最逗3B欢乐"
- data = re.match("逗\dB", text)
- print(data) # None
-
- #手机号码校验
- import re
- while True:
- iphone = input('请输入手机号码:').strip()
- res = re.match("1[35678]\d{9}", iphone)
- #res = re.match("1[3-9]\d{9}", iphone)
- if res:
- print(iphone)
- break
-
-
- #邮箱校验
- import re
- while True:
- email = input('请输入邮箱:').strip()
- res = re.match("\w+@\w+\.\w+", email, re.ASCII)
- if res:
- print(email)
- break
-
-
- import re
-
- text = "逗2B最逗3B欢乐"
- data = re.match("逗\dB", text)
- if data:
- content = data.group() # "逗2B"
- print(content)
-
- import re
-
- text = "大小逗2B最逗3B欢乐"
- data = re.search("逗\dB", text)
- if data:
- print(data.group()) # "逗2B"
-
- import re
-
- text = "逗2B最逗3B欢乐"
- data = re.sub("\dB", "沙雕", text)
- print(data) # 逗沙雕最逗沙雕欢乐
-
- import re
-
- text = "逗2B最逗3B欢乐"
- data = re.sub("\dB", "沙雕", text, 1)
- print(data) # 逗沙雕最逗3B欢乐
-
- import re
-
- text = "逗2B最逗3B欢乐"
- data = re.split("\dB", text)
- print(data) # ['逗', '最逗', '欢乐']
-
- import re
-
- text = "逗2B最逗3B欢乐"
- data = re.split("\dB", text, 1)
- print(data) # ['逗', '最逗3B欢乐']
-
- import re
-
- text = "逗2B最逗3B欢乐"
- data = re.finditer("\dB", text)
- for item in data:
- print(item.group())
-
- import re
-
- text = "逗2B最逗3B欢乐"
- data = re.finditer("(?P<xx>\dB)", text) # 命名分组
- for item in data:
- print(item.groupdict())
-
- text = "dsf130429191912015219k13042919591219521Xkk"
- data_list = re.finditer("\d{6}(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}[\d|X]", text)
- for item in data_list:
- info_dict = item.groupdict()
- print(info_dict)
-