正则表达式
. 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线 \s 匹配任意地空白符 \d 匹配数字 \n 匹配一个换行 \t 匹配一个制表符 ^ 匹配字符串的开始 $ 匹配字符串的结尾 \W 匹配非字母或数字或下划线 \D 匹配非数字 \S 匹配非空白符 a|b 匹配字符a或字符b () 匹配括号内的表达式,也表示一个组 […] 匹配字符组中的字符 [^…] 匹配除了字符组中的字符的所有字符
---------------------------------------------------------------
量词:控制前面的元字符出现的次数
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n次到m次
例子:
^\d\d\d\d\d : 开始到最后必须是数字
[abcdefg] : 每个字在字符组中是否出现
[a-zA-Z0-9] : 字符组范围
[^a-zA-Z0-9] :除了范围里的都是
\d{11} : 匹配11位数字
\d+ : 匹配数字至少出现一次或者多次
---------------------------------------------------------------
贪婪匹配和惰性匹配
.* :贪婪匹配 . 匹配除换行符以外的任意字符 *是多个
.*? :惰性匹配 *?尽可能少匹配东西
内容<div class="jay">周杰伦</div><div class="jj">林俊杰</div>
正则表达式<div class=".*?">(.*?)</div>
结果<div class="jay">周杰伦</div><div class="jj">林俊杰</div>
---------------------------------------------------------------
str:sefasfesafeasxfeswefwfsx
正则.*?x
sefasfesafeasx
feswefwfsx
---------------------------------------------------------------
扩展
[\u4e00-\u9fa5] 匹配中文字符
\n\s*\r 匹配空白行
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
匹配邮箱
[a-zA-z]+://[^\s]* 网址url
\d{3}-\d{8}|\d{4}-\{7,8} 匹配国内电话号码
[1-9][0-9]{4,} 匹配腾讯qq号
[1-9]\d{5}(?!\d) 匹配中国邮政
^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$ 匹配18位身份证
import re
lst = re.findall(r"\d+","我的电话是:10086,我儿子电话号码10089")
print(lst)
输出['10086', '10089']
#finditer:匹配字符串中所有的内容[返回的是迭代器],从迭代器中拿到内容需要.group()
it = re.finditer(r"\d+","我的电话是:10086,我儿子电话号码10089")
for i in it:
print(i.group())
#search,找到一个结果就返回,返回的结果是match对象,拿数据需要.group()
s= re.search(r"\d+","我的电话是:10086,我儿子电话号码10089")
print(s.group())
#match是从头开始匹配
s= re.match(r"\d+","10086,我儿子电话号码10089")
print(s.group())
预加载正则表达式
#预加载正则表达式
obj = re.compile(r"\d+")
ret = obj.finditer("我的电话是:10086,我儿子电话号码10089")
for it in ret:
print(it.group())
(?P<组名>正则)可以从正则匹配的内容中进一步提取内容
s = """
<div class='西游记'><span id='10010'>中国联通</span></div>
<div class='fesf'><span id='21231'>爽肤水</span></div>
"""
#(?P<组名>正则)可以从正则匹配的内容中进一步提取内容
obj = re.compile(r"<div class='.*?'><span id='(?P<id>\d+)'>(?P<wahaha>.*?)</span></div>",re.S)
result = obj.finditer(s)
for it in result:
print(it.group("id"))
print(it.group("wahaha"))
obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>\w+)</span>",re.S)
result = obj.search(s)
print(result.group())
print(result.group("id"))
print(result.group("name"))