01-recognize regular expression认识正则表达式
02-main functions 主要的函数
总结:
- 尽量使用泛匹配、非贪婪匹配,使用括号得到匹配目标,要匹配换行就用re.S模式
30天入门正则表达式
)
在线工具-正则表达式测试
符号 | 解释 | 示例 | 说明 |
---|---|---|---|
. | 匹配除换行符(\n)任意字符 | b.t | 可以匹配bat / but / b#t / b1t等 |
\w | 匹配字母/数字/下划线 | b\wt | 可以匹配bat / b1t / b_t等 但不能匹配b#t |
\s | 匹配空白字符(包括\r、\n、\t等) | love\syou | 可以匹配love you |
\d | 匹配数字 | \d\d | 可以匹配01 / 23 / 99等 |
\b | 匹配单词的边界 | \bThe\b | 只匹配一个位置,该位置不能是字母、数字、或下划线 |
^ | 匹配字符串的开始 | ^The | 可以匹配The开头的字符串 |
$ | 匹配字符串的结束 | .exe$ | 可以匹配.exe结尾的字符串 |
\W | 匹配非字母/数字/下划线 | b\Wt | 可以匹配b#t / b@t等 但不能匹配but / b1t / b_t等 |
\S | 匹配非空白字符 | love\Syou | 可以匹配love#you等 但不能匹配love you |
\D | 匹配非数字 | \d\D | 可以匹配9a / 3# / 0F等 |
\B | 匹配非单词边界 | \Bio\B | |
[] | 匹配来自字符集的任意一个单一字符 | [aeiou] | 可以匹配任一元音字母字符 |
[^] | 匹配不在字符集中的任意单一字符 | [^aeiou] | 可以匹配任一非元音字母字符 |
* | 匹配0次或多次 | \w* | |
+ | 匹配1次或多次 | \w+ | |
? | 匹配0次或1次 | \w? | |
{N} | 匹配N次 | \w{3} | |
{M,} | 匹配至少M次 | \w{3,} | |
{M,N} | 匹配至少M次至多N次 | \w{3,6} | |
| | 分支 | foo|bar | 可以匹配foo或者bar |
(?#) | 注释 | ||
(exp) | 匹配exp并捕获到自动命名的组中 | ||
(? |
匹配exp并捕获到名为name的组中 | ||
(?:exp) | 匹配exp但是不捕获匹配的文本 | ||
(?=exp) | 匹配exp前面的位置 | \b\w+(?=ing) | 可以匹配I'm dancing中的danc |
(?<=exp) | 匹配exp后面的位置 | (?<=\bdanc)\w+\b | 可以匹配I love dancing and reading中的第一个ing |
(?!exp) | 匹配后面不是exp的位置 | ||
(? | 匹配前面不是exp的位置 | ||
*? | 重复任意次,但尽可能少重复 | a.*b a.*?b |
将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串 |
+? | 重复1次或多次,但尽可能少重复 | ||
?? | 重复0次或1次,但尽可能少重复 | ||
{M,N}? | 重复M到N次,但尽可能少重复 | ||
{M,}? | 重复M次以上,但尽可能少重复 | ||
\ | 防止转义 | 1\.5 | 只匹配1.51a5125中的1.5 |
01-recognize regular expression认识正则表达式
正则表达式主要用于字符串查找/匹配/分割
import re
match(正则表达式字符串,需要匹配的字符串)
判断一个字符串是否是标识符(字母/数字/下划线组成,数字不开头)
[a-z]:是字母'a'到'z'中的任意一个;[A-Z];[0-9]:0到9中的任意个
str_ = r'[a-zA-Z]\w*$'
print('>>>',re.match(str_, 'ssf235sf'))
1.16.|-->分支(相当于逻辑运算符中的'or')
str_ = r'(a|b)abc' # -->匹配第一个字符是a或者b,后面是abc
print(re.match(str_, 'babc'))
print(re.match(r'(\d{3})|([a-z]{3})', '118a'))
总结?:就是在重复匹配多次的匹配中如果后面加?,就是尽可能以最少的次数的去匹配
2.main functions 主要的函数
import re
2.1 compile 将正则表达式字符编译成正则对象(就可以去调用相关的正则表达式对象方法)
exp = re.compile(r'\d\d[a-zA-Z]{2}')
print(type(result))
print(result.match('13sg'))
<_sre.SRE_Match object; span=(0, 4), match='13_s'>
2.2.match()
a. re.match(正则表达式字符串/对象,要匹配的字符串)
b. 正则表达式对象.match(要匹配的字符串)
从字符串的起始位置开始匹配
成功就返回匹配对象,否则返回None
实例:
result = re.match(r'(\w+) (\w+)(.*)', 'hello world!')
print(result)
获取匹配结果在原字符串中的范围
print(result.span())
获取匹配开始的位置和结束的位置
print(result.start(), result.end())
获取匹配的结果
print(result.group(1,2))
print(result.groups())
获取原字符串
print(result.string)
结果:
<_sre.SRE_Match object; span=(0, 12), match='hello world!'>
(0, 12)
0 12
('hello', 'world')
('hello', 'world', '!')
hello world!
2.3. search()
a. re.search(正则表达式/对象, 指定的字符串)
b. 正则对象.search(指定的字符串)
在指定的字符串中, 去查找第一个指定正则表达式匹配的字符串,如果有就返回匹配对象,如果没有就返回None
str = r'a\dc'
result = re.search(r'a\dc', 'aiga4cgtwea3c sa')
print(result) # value : <_sre.SRE_Match object; span=(3, 6), match='a4c'>
2.4. findall()
a. re.findall(正则表达式对象, 指定的字符串)
b. 正则对象.findall(指定的字符串)
获取指定字符串中,所有满足正则表达式的子串,返回一个列表
result = re.findall(r'a\dc', 'ioa2caggea4casd')
print(result)
结果:
['a2c', 'a4c']
2.5.split()
正则对象.split(指定字符串)
re.split(正则对象表达式,指定的字符串)
str2 = '窗前明月光,疑是地上霜.举头望明月,低头思故乡'
result = re.split(r'[,.]', str2, 2)
print(result)
结果:
['窗前明月光', '疑是地上霜', '举头望明月,低头思故乡']
2.6. sub()
re.sub(正则表达式, 替换字符串, 原字符串) -->替换后原字符串不变,返回一个新的字符串
将指定字符串中指定的子串替换成其他的字符串
str1 = 'abcdsd sgeyghaddsfbdhvvbbbb'
result = re.sub(r'[ab]', '*', str1)
print(result,'\n',str1)
结果:
cdsd sgeyghddsfdhvv****
abcdsd sgeyghaddsfbdhvvbbbb
补充:正则表达式中中文的判断
判断是否有中文,如果有就打印'不合格'
中文的Unicode编码范围:\u4e00-\u9fa5(正则表达式中Unicode前面需要加\u)
result = re.search(r'[\u4e00-\u9fa5]', 'asgeq大几十个d')