申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。
普通字符包括没有显式指定为元字符的所有可打印
和不可打印
字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
可打印字符 | 能打印的字符 |
---|---|
[xyz] |
一个字符集,表示匹配任意一个字符 |
实例 | [xyz] 实例,例如:正则表达式[eod] 匹配字符串’Hello,World‘ 中所有的 e o d 字母 |
[^xyz ] |
一个否定字符集,表示匹配任意未包含的字符。 |
实例 | [^xyz] 实例,例如:正则表达式[^eod] 匹配字符串’Hello,World‘ 中除了 e o d 字母的所有字母 |
[a-z] |
字符范围,表示匹配所有小写字母 |
实例 | [a-z] 实例,例如:正则表达式[a-z] 匹配字符串’Hello,World‘ 中的e l l o o r l d |
[A-Z] |
字符范围,表示匹配所有大写字母 |
实例 | [A-Z] 实例,例如:正则表达式[A-Z] 匹配字符串’Hello,World‘ 中的H W |
\d |
字符范围,表示匹配数字字符 |
实例 | \d 实例,例如:正则表达式\d 匹配字符串’Hello,123‘ 中的123 |
\D |
字符范围,表示匹配非数字字符 |
实例 | \D 实例,例如:正则表达式\D 匹配字符串’Hello,123‘ 中的Hello, |
\w |
字符范围,表示匹配字母、数字、下划线的字符,等价于 [A-Za-z0-9_] |
实例 | \w 实例,例如:正则表达式\w 匹配字符串’Hello,World‘ 中的Hello World |
\W |
字符范围,表示匹配非字母、数字、下划线的字符,等价于 [^A-Za-z0-9_] |
实例 | \W 实例,例如:正则表达式\W 匹配字符串’Hello,World‘ 中的, |
\s\S |
字符范围,匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行 |
实例 | \s\S 实例,例如:正则表达式\s\S 在字符串’Hello,World‘ 中的Hello,World |
非打印字符 | 不能打印的字符 |
---|---|
\f |
匹配一个换页符 |
\n |
匹配一个换行符 |
\r |
匹配一个回车符 |
\s |
字符范围,表示匹配所有空白符,包括换行、制表符、换页符 |
\S |
字符范围,表示匹配所有非空白符 |
\t |
匹配一个制表符 |
\v |
匹配一个垂直制表符 |
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。
特殊字符 | 一些有特殊含义的字符 |
---|---|
\ |
将下一个字符标记为特殊字符、或原义字符。 |
实例 | \ 实例,例如: n 匹配字符n 。\n 匹配换行符 。序列\\ 匹配\ |
^ |
匹配输入字符串的开始位置 |
$ |
匹配输入字符串的结尾位置 |
* |
匹配前面的子表达式零次或多次 |
+ |
匹配前面的子表达式一次或多次 |
? |
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符 |
. |
匹配除换行符 \n 之外的任何单字符 |
() |
标记一个子表达式的开始和结束位置 |
[] |
标记一个中括号表达式的开始和结束位置 |
{} |
标记限定符表达式的开始和结束位置 |
| |
指明两项之间的一个选择 |
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
限定符 | 描述 |
---|---|
* |
匹配前面的子表达式零次或多次 |
实例 | * 实例,例如:正则表达式el* 能匹配字符串’Hello,World‘ 中的e 或el 或ell |
+ |
匹配前面的子表达式一次或多次 |
实例 | + 实例,例如:正则表达式el+ 能匹配字符串’Hello,World‘ 中的el 或ell |
? |
匹配前面的子表达式零次或一次 |
实例 | + 实例,例如:正则表达式el? 能匹配字符串’Hello,World‘ 中的e 或el |
{n} |
n 是一个非负整数。匹配确定的 n 次 |
实例 | {n} 实例,例如:正则表达式c{4} 能匹配字符串’abbcccc‘ 中的cccc |
{n,} |
n 是一个非负整数。至少匹配n 次 |
实例 | {n,} 实例,例如:正则表达式c{3,} 能匹配字符串’abbcccc‘ 中的ccc 或cccc |
{n,m} |
m 和 n 均为非负整数,其中n <= m,最少匹配 n 次且最多匹配 m 次 |
实例 | {n,m} 实例,例如:正则表达式c{3,4} 能匹配字符串’abbcccc‘ 中的ccc 或cccc |
定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
定位符 | 描述 |
---|---|
^ |
匹配输入字符串的开始位置 |
$ |
匹配输入字符串的结尾位置 |
\b |
匹配一个单词边界,即字与空格间的位置 |
\B |
非单词边界匹配 |
re 模块使 Python 语言拥有全部的正则表达式功能。
match()方法:尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配,就返回None。
函数语法:
re.match(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串。
flags:标志位,用于控制正则表达式的匹配方式
import re
# 文本内容:一次只做一件事,做到最好!
content = 'Do one thing at a time, and do well!'
print('文本长度:', len(content))
# 使用正则表达式提取文本中的Do one thing at a time
# 正则表达式方法1:
result1 = re.match('^Do\s\w{3}\s\w{5}\s\w{2}\s\w\s\w{4}', content)
# 正则表达式方法2:
result2 = re.match('^Do\s\w+\s\w+\s\w+\s\w\s\w+', content)
# 正则表达式方法3:
result3 = re.match('^Do.*?time', content)
print('正则表达式方法1:')
# 打印re.Match object就证明成功匹配
print(result1)
# 打印提取结果
print('提取结果:', result1.group())
# 打印匹配的范围
print(result1.span())
print('正则表达式方法2:')
print(result2)
print('提取结果:', result2.group())
print(result2.span())
print('正则表达式方法3:')
print(result3)
print('提取结果:', result3.group())
print(result3.span())
执行结果>>>>>>>>>>
文本长度: 36
正则表达式方法1:
<re.Match object; span=(0, 22), match='Do one thing at a time'>
提取结果: Do one thing at a time
(0, 22)
正则表达式方法2:
<re.Match object; span=(0, 22), match='Do one thing at a time'>
提取结果: Do one thing at a time
(0, 22)
正则表达式方法3:
<re.Match object; span=(0, 22), match='Do one thing at a time'>
提取结果: Do one thing at a time
(0, 22)
search()方法:扫描整个字符串并返回第一个成功匹配的结果。
函数语法:
re.search(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串。
flags:标志位,用于控制正则表达式的匹配方式
import re
# 以此HTML文档(我的CSDN主页)为例,使用正则表达式实现相应信息的提取。
# 提取我的点赞数据
content = '''-
获得210次点赞
-
内容获得106次评论
-
获得561次收藏
'''
result = re.search('(.*?)(.*?)(.*?)', content, re.S)
print(result.group(1), result.group(2), result.group(3))
执行结果>>>>>>>>>>
获得 210 次点赞
findall()方法:在字符串中找到正则表达式所匹配的所有子符串,并返回一个列表,如果没有找到匹配的,则返回空列表。
函数语法:
re.findall(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串。
flags:标志位,用于控制正则表达式的匹配方式
import re
# 还是以此HTML文档(我的CSDN主页)为例,使用正则表达式实现相应信息的提取。
# 提取我的所有信息
content = '''-
获得210次点赞
-
内容获得106次评论
-
获得561次收藏
'''
results = re.findall('(.*?)(.*?)(.*?)', content, re.S)
for result in results:
print(result[0] + result[1] + result[2])
执行结果>>>>>>>>>>
获得210次点赞
内容获得106次评论
获得561次收藏
sub()方法:替换字符串中的匹配项,类似于字符串的replace
函数语法:
re.sub(pattern, repl, string, count=0, flags=0)
pattern:匹配的正则表达式
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
import re
# 文本内容:勇往直前, 决不放弃
content = 'Keep on going never give up'
content = re.sub('\s', '-', content)
print(content)
执行结果>>>>>>>>>>
Keep-on-going-never-give-up
compile()方法:函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,方便后面的匹配复用。
import re
# 文本内容:人生苦短。
content1 = 'Life is but a span.'
# 文本内容:人过半生,方知天命。
content2 = 'Life is half spent before we know what it is.'
# 文本内容:人生并不是康庄大道。
content3 = 'Life is not all roses.'
pattern = re.compile('^Life\s.*?\.$')
result1 = re.search(pattern, content1)
result2 = re.search(pattern, content2)
result3 = re.search(pattern, content3)
print(result1.group() + '\n' + result2.group() + '\n' + result3.group())
执行结果>>>>>>>>>>
Life is but a span.
Life is half spent before we know what it is.
Life is not all roses.
上面常用的方法中的flags就是使用的修饰符,可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
.
这个特殊字符匹配时包括换行在内的所有字符,就是忽略换行符贪婪匹配指的是限定符尽可能多的匹配字符串,默认情况下限定符都是贪婪匹配。
非贪婪匹配是指限定符尽可能少的匹配字符串,在限定符后加上?
表示非贪婪匹配。
import re
# 文本内容:博学使人谦逊,无知使人骄傲。
content = 'Knowledge makes humble, ignorance makes proud.'
# 贪婪匹配
result1 = re.match('K.*', content)
print(result1.group())
# 非贪婪匹配
result2 = re.match('K.*?', content)
print(result2.group())
执行结果>>>>>>>>>>
Knowledge makes humble, ignorance makes proud.
K
^[0-9]*$
^\d{n}$
^\d{n,}$
^\d{m,n}$
^(0|[1-9][0-9]*)$
^([1-9][0-9]*)+(\.[0-9]{1,2})?$
^(\-)?\d+(\.\d{1,2})$
^(\-|\+)?\d+(\.\d+)?$
^[0-9]+(\.[0-9]{2})?$
^[0-9]+(\.[0-9]{1,3})?$
^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
^\d+$ 或 ^[1-9]\d*|0$
^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
^[\u4e00-\u9fa5]{0,}$
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
^.{3,20}$
^[A-Za-z]+$
^[A-Z]+$
^[a-z]+$
^[A-Za-z0-9]+$
^\w+$ 或 ^\w{3,20}$
^[\u4E00-\u9FA5A-Za-z0-9_]+$
^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
^%&',;=?$\"
等字符:[^%&',;=?$\x22]+
~
的字符:[^~\x22]+
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
\d{3}-\d{8}|\d{4}-\d{7}
((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
^[a-zA-Z]\w{5,17}$
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
^\d{4}-\d{1,2}-\d{1,2}
^(0?[1-9]|1[0-2])$
^((0?[1-9])|((1|2)[0-9])|30|31)$
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
[^\x00-\xff]
(包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))\n\s*\r
(可以用来删除空白行)<(\S*?)[^>]*>.*?|<.*? />
( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$
) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)[1-9][0-9]{4,}
(腾讯QQ号从10000开始)[1-9]\d{5}(?!\d)
(中国邮政编码为6位数字)((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}
一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!
如果看完觉得有所收获的话,记得一键三连哦,谢谢大家!