1. 简介
正则表达式regular Expression是一种文本模式,包括普通字符和特殊字符(即元字符)
正则表达式使用单个字符串来描述、匹配一系列某个句法规则的字符串
作用:
- 测试字符串内的模式;如数据验证,输入是否符合电话号码模式
- 替换文本
- 基于模式匹配从字符串中提取子字符串
2. 语法
-
普通字符
[abc]
匹配[]中所有字符
[^abc]
匹配除[]外其他所有字符
[A-Z]
表示一个区间,匹配所有大写字母,[a-z]
表示所有小写字母
.
匹配除换行符号\n \r
之外的任何单个字符,相当于[^\n\r]
[\s\S]
匹配所有。\s
匹配所有空白符,包括换行;\S
非空白符,不包括换行
\w
匹配字母、数字、下划线,等价于[A-Za-z0-9_]
-
非打印字符
-
特殊字符
^
匹配输入字符串的开始位置
$
匹配结尾;若匹配
()
标记一个子表达式的开始和结束位置;若匹配(),则使用( )
*
匹配前面的子表达式零次或多次
+
匹配前面的子表达式一次或多次
.
匹配除换行符\n之外的任何单字符
?
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
\
将下一个字符标记为特殊字符或原义字符、或向后引用、或八进制转义符
|
指两项之间的一个选择 -
限定符
*
匹配前面子表达式零次或多次
+
匹配亲密子表达式一次或多次
?
匹配前面子表达式零次或一次
{n}
n是非负整数。匹配确定的n次
{n,}
n是非负整数。至少匹配n次
{n, m}
n,m是非负整数,n<=m。最少匹配n次,且最多匹配m次 -
贪婪模式&非贪婪模式
*
+
限定符,是贪婪的,即尽可能多的匹配文字
?
,在贪婪模式后添加?
,就可以实现非贪婪或最小匹配 -
定位符
^
匹配输入字符串开始位置
$
匹配输入字符串结束位置
\b
匹配一个单词边界,即字与空格间的位置
\B
非单词边界匹配
注:定位法与限定符不能一起使用;如^*
-
选择
用圆括号()
将所有选项括起来,相邻的选项之间用|
分隔
()
表示捕获分组,()
会把每个分组里的匹配的值保存起来,多个匹配值可以通过数字n
来查看(n从1开始) -
反向引用
import re
s = "Abc123df1ac!\r@#$^&\n——_"
# patt = r"[0-9]+" # 找出数字 # ['123', '1']
# patt = "[abc]" # 匹配[]中所有字符 ['b', 'c', 'a', 'c']
# patt = '[^abc]' # 匹配除[]外其他所有字符 ['A', '1', '2', '3', 'd', 'f', '1', '!', '\r', '@', '#', '$', '^', '&', '\n']
# patt = '[A-Z]' # 匹配大写字母 ['A']
# patt = '.' # 除\n和\r外的任何单一字符 ['A', 'b', 'c', '1', '2', '3', 'd', 'f', '1', 'a', 'c', '!', '@', '#', '$', '^', '&']
# patt = r"[\s\S]" # 匹配所有
# patt = r"\w+" # 匹配字母、数字、下划线 ['Abc123df1ac', '_']
# s = "13789001234"
# patt = r"^1[3-9]\d{9}$" # 国内手机号码的正则校验
# ----贪婪模式&非贪婪模式
s = "<h1>RUNOOB-菜鸟教程</h1>"
patt = "<.*>" # 贪婪模式:['<h1>RUNOOB-菜鸟教程</h1>']
patt = "<.*?>" # 非贪婪模式:['<h1>', '</h1>']
# -----定位符
s = "How are you,Chapter ter?"
patt = r"\bCha*" # ['Cha'] 匹配单词 Chapter 的开头三个字符
# patt = r"ter\b" # ['ter', 'ter'] 匹配单词结尾的ter
# res = re.findall(patt, s)
# print(res)
# -----分组
s = "http://www.runoob.com:80/html/html-tutorial.html"
patt = r"(\w+):\/\/([^/:]+):(\d*)?([^# ]*)"
res = re.match(patt, s)
print(res) # <re.Match object; span=(0, 48), match='http://www.runoob.com:80/html/html-tutorial.html'>
print(res.group(1)) # http 协议
print(res.group(2)) # www.runoob.com 表示域
print(res.group(3)) # 80 表示端口
print(res.group(4)) # /html/html-tutorial.html 表示页信息,或web地址指定路径
网友评论