基础(十三)
ctrl+f 运行文本文件正则表达式
概念
regular expression
文本形式,描述搜索文本时匹配一个或多个字符串
场景:数据验证、文本扫描、文本提取、文本替换、文本分割
语法
字面值
普通字符
转义:\ ^ $ . | ? * + () [] {}
元字符
匹配
单字
预定义元字符
- . 除\n外的所有字符
- \d 数字 = [0-9]
- \D 非数字 = [^0-9]
- \s 空白字符 \t\n\r\f\v
- \S 非空白字符 [^\t\n\r\f\v]
- \w 字母数字字符[a-zA-z0-9_]
- \W 非字母数字字符[^a-zA-z0-9_]
批量备选
| yes|no
量词(字符、元字符、字符集重复)
?:0或1次
*:0或1次
+:1或多次
特定
- {n,m} 范围次数
- {n} n次
- {n,} 至少n次
贪婪与非贪婪
贪婪(默认):尽量匹配最大范围结果
非贪婪
- 尽量匹配最小的范围结果
- 方法:量词后追加?
- ?? *? +?
边界匹配
^ 行首
$ 行尾
\b 单词边界
\B 非单词边界
\A 输入开头
\Z 输入结尾
注:上下文差异会有不同表现
python正则表达式
模块:import re
RegexObject
模式对象
表现编译后的正则表达式(编译为字节码并缓存)
编译 re.compile(r’模式’)
r:确保不会转义
.findall()
查找所有非重叠匹配项 返回list
>>>import re
>>>text = 'Tom is 8 years old.Mike is 25 years old'
>>>pattern = re.compile('\d+')
>>>pattern.findall(text)
['8', '25']
>>>re.findall('\d+',text)
['8', '25']
注释:\d数字,\d+多个数字
>>>import re
>>>s = "\\author:Tom"
>>>pattern = re.compile('\\author')
>>>pattern.findall(s)
[]
>>>pattern = re.compile('\\\\author')
>>>pattern.findall(s)
['\\author']
>>>pattern = re.compile(r'\\author')
import re
text = 'kitty is 12 years old.Mike is 23 years old.Amy is 80 years old'
pattern = re.compile(r'\d+')
pattern.findall(text)
['12', '23', '80']
p_name = re.compile(r'[A-Z]')
p_name.findall(text)
['M', 'A']
p_name = re.compile(r'[A-Z]\w+')
p_name.findall(text)
['Mike', 'Amy']
.match(string[,pos[,endpos]])
匹配:仅从起始位置
返回MatchObject
.search(string[,pos[,endpos]])
任意位置搜索
返回 MatchObject
>>>import re
>>>pattern = re.compile(r'<html>')
>>>text = '<html><head></head><body></body></html>'
>>>pattern.match(text)
<re.Match object; span=(0, 6), match='<html>'>
>>>text2 = ' <html><head></head><body></body></html>'
>>>pattern.match(text2)
>>>pattern.match(text2,1)
<re.Match object; span=(1, 7), match