正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
常用元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符。 要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式 |
\w | 匹配字母或数字或下划线或汉字 == [A-Za-z0-9_] |
\s | 匹配任意的空白符 == [\f\n\r\t\v] |
\d | 匹配数字 == [0-9] |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
常用限定符
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
一、正则表达式对象
re.RegexObject
re.compile() 返回 RegexObject 对象。用作 pattern
re.MatchObject
group() 返回被 RE 匹配的字符串。
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
二、re匹配韩束
re.match(pattern, string, flags=0)
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。 flags就是标志位,用于控制正则表达式的匹配方式。
如:不区分大小写,re.I 或者 re.IGNORECASE]
我们可以使用group 或者 groups方法得到字符串
注意:
group(num=0): 匹配的整个表达式的字符串
groups(): 返回一个包含所有小组字符串的元组
re.search(pattern, string, flags=0)
re.search 扫描整个字符串并返回第一个成功的匹配。
import re
match = re.search(re.compile("(\w+) wen (\w+)"), " zhao wen dao ")
print(match.group())
print(match.groups())
print(match.group(1))
print(match.group(1, 2))
# zhao wen dao
# ('zhao', 'dao')
# zhao
# ('zhao', 'dao')
re.sub(pattern, repl, string, count=0)
repl 是要替代的字符串
import re
phone = "2004-959-559 # 这是一个电话号码"
num = re.sub(r"#.*", "", phone)
print(num)
num = re.sub(r'\D', "", phone)
print(num)
# 2004-959-559
# 2004959559
findall(pattern, string, flags=0)
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
string = " zhao wen dao learn python "
p1 = re.compile("\w+\s+\w+")
print(p1.findall(string))
# ['zhao wen', 'dao learn']
p1 = re.compile("(\w+)\s+\w+")
print(p1.findall(string))
# ['zhao', 'dao']
p1 = re.compile("((\w+)\s+\w+)")
print(p1.findall(string))
# [('zhao wen', 'zhao'), ('dao learn', 'dao')]
可以发现,当findall 中pattern 有括号出现,返回的便是括号里的内容,而不是匹配的整个字符串,如果有多个括号,返回tuple 列表,tuple里的个数等于括号出现的个数,先后顺序按照括号出现的先后顺序。
re.split(pattern, string, maxsplit=0, flags=0])
import re
print(re.split('\W+', ' zwd, zhaowd!, hello #.'))
# ['', 'zwd', 'zhaowd', 'hello', '']
print(re.split('(\W+)', ' zwd, zhaowd!, hello #.'))
# ['', ' ', 'zwd', ', ', 'zhaowd', '!, ', 'hello', ' #.', '']
# 包括被用作split的字符串