《Python正则表达式》--逻辑公式<2>
# 常用操作2
# ========================================================================
# ========================================================================
# 用户名可以是字母或数字、下划线,不能是数字开头,用户长度必须6位以上[0-9a-zA-Z]
import re
username = "001admin"
result = re.match("[a-zA-Z][0-9a-zA-Z]{5,}", username)
print(result) # None
# ---------------------------------------------------------
username = "admin001"
result = re.match("[a-zA-Z][0-9a-zA-Z_]{5,}$", username)
# todo 等价于 re.search("^[a-zA-Z][0-9a-zA-Z_]{5,}$", username)
# 结尾要带 $ 否则 "admin001@#!@" 也会被匹配上
print(result) # <re.Match object; span=(0, 8), match='admin001'>
# result = re.match("[a-zA-Z][0-9a-zA-Z]{5,}",username) 等价于
result = re.match(r"[a-zA-Z]\w{5,}$", username)
print(result)
# -------------------------------------------------------------
# \b的使用
# 检索出 所有的.py
msg = "aa.py a*.py a*py ab.txt bb.py kk.png uu.py apyb.txt"
result = re.findall(r"\w*\.py\b",msg) # 能直接写 . 吗?需要: \. 否则会匹配到 a*py
print(result)
# -------------------------------------------------------------
# 手机号码的正则
phone_number = "16600277577"
result = re.match(r"1[356789]\d{9}$",phone_number)
print(result)
分组操作
# ========================================================================
# ========================================================================
# 分组操作
# 匹配数字 0-100
# 5 50 100
import re
num = "101"
result = re.match("[1-9]?\d?$|100$", num)
print(result)
# -------------------------------------------------------------
# 验证邮箱 163 126 qq @前面5 -20位
# () 要用小括号 不能用 []
# (word|word|word) [abc] 表示的是一个个的字母,而不是单词
email = "893487555@yeah.net"
result = re.match(r"\w{5,20}@(163|126|qq)\.(com|cn|net)$", email)
print(result)
# -------------------------------------------------------------
# 不是以 4 7 结尾的手机号 11位
phone = "13800277785"
result = re.match(r"1[356789]\d{8}[01235689]$", phone)
print(result)
# -------------------------------------------------------------
# 提取带区号的电话号码,并且分别提取出区号和电话
phone = "010-12345678" # 分别提取 区号和后面的电话号码
result = re.match(r"(\d{3}|\d{4})-(\d{7,8})$", phone)
print(result) # <re.Match object; span=(0, 12), match='010-12345678'>
# 分别提取: # 小括号 表示 分组
print(result.group())
print(result.group(1)) # 提取到第一组的内容
print(result.group(2)) # 提取到第二组的内容
print(result.groups()) # 提取到多个组的内容
# -------------------------------------------------------------
# 爬虫 提取标签里面的内容
msg = "<html>abc</html>"
result = re.match(r"<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>$", msg)
print(result)
print(result.group(1))
# ----------------------------
# 提取标签 只有一个标签 多个组 使用数字
msg = "<h1>hello</h1>"
result = re.match(r"<([0-9a-zA-Z]+)>(.+)</\1>$", msg)
print(result)
print(result.group(1))
print(result.group(2))
# ----------------------------
# 提取标签 有多个标签
msg = "<html><h1>hello</h1></html>"
result = re.match(r"<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)</\2></\1>$", msg)
print(result)
print(result.group(1))
print(result.group(2))
print(result.group(3))
# 多个标签 容易写混了
# ----------------------------
# 起名的方式来解决这个问题 (?P<名字>正则)(?P=名字)
msg = "<html><h1>hello</h1></html>"
result = re.match(r"<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>", msg)
# name1相当于给标签起了一个名字
print(result)
print(result.group(1))
print(result.group(2))
print(result.group(3))
print(result.groups())
# -------------------------------------------------------------
# 函数: match 、search 、findall、sub 替换 split 切割
# sub 格式: sub(正则表达式,"新内容",要搜索的字符串)
result = re.sub(r"\d+", "90", "java:99,python:100,C:60")
print(result)
# 可以给所有搜索到的分数,通过函数来进行数据处理
def func(temp):
num = temp.group()
num = int(num) + 1
return str(num)
result = re.sub(r"\d+", func, "java:99,python:100,C:60")
print(result)
# --------------------------------
# split 切割 在字符串中 进行搜索 如果遇到符合条件的 进行分割,保存到列表中
result = re.split(r"[:,]", "java:99,python:100,C:60") # 在字符串中如果遇到: 或者,就分割,将结果返回为一个列表
print(result)
贪婪和非贪婪
# =========================================================================
# =========================================================================
import re
# 默认是贪婪的
msg = "abc123abc"
result = re.match(r"abc(\d+)",msg)
print(result)
# 变成非贪婪的
# 如果想将贪婪模式变成非贪婪模式
result = re.match(r"abc(\d+?)",msg)
print(result)
总结
# =============================================================================
# =============================================================================
正则表达式:
re 模块
import re
re.match() # 从头开始匹配
re.search() # 不是从头开始匹配,只返回第一个匹配到的结果
re.findall() # 也不是从头开始匹配,会返回所有字符串中 匹配到的结果
re.sub(pattern,"新的内容",str) #替换
re.split(pattern,str) ---> 返回列表,可以通过不同的 子字符串 来分割同一个 要搜索的字符串,用列表的形式存储这个结果
基础:
符号:
. 任意字符
"^" 用于匹配字符串的开始,即行首 shift +6 表示开头,如果在在字符串开头 ^ ,表示要从头开始匹配
"$" 用于匹配字符串的末尾(末尾如果有换行符\n,就匹配\n前面的那个字符),即行尾 shift+4 表示结尾 ,在字符串的结尾 $ ,匹配到字符串的结尾
[] 范围
| 或者
() 一组
量词:
* >=0
+ >=1
? 0,1====》 体现出 非贪婪
表示数量范围:
{m} = m
{m,} >= m
{m,n} 在m,n之间 前后都包含
预定义:
\s space
\S not space
\d digit
\D not digit
\w word [0-9a-zA-Z_]
\W not word [^0-9a-zA-Z]
\b 边界
分组:
() ---> group(1)
number
(\w+)(\d*) ----> group(1) group(2)
引用:
(\w+)(\d*) \1 \2 表示引用前面的内容
name
(?P<name>\w+) (?P=name)
贪婪和非贪婪
Python 里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符
非贪婪则相反,总是尝试匹配尽可能少的字符
在"*" "?" "+" "{m,n}" 后面加上? ,使贪婪变成非贪婪

浙公网安备 33010602011771号