正则表达式
. 匹配除换行符以外的任意字符 \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"))
本文详细介绍了正则表达式的各种元字符、量词及其在匹配过程中的贪婪与惰性匹配。通过实例展示了如何使用正则进行字符串匹配,如匹配电话号码、邮箱、网址等,并讲解了Python中`re`模块的使用方法,包括`findall`、`finditer`、`search`和`match`等函数。此外,还提到了预加载正则表达式的方法以及如何使用正则中的组来提取匹配内容。
171

被折叠的 条评论
为什么被折叠?



