正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串
正则表达式是字符串处理的有力工具,正则表达式使用预定义的模式去匹配一类具有共同特征的字符串,可以快速、准确地完成复杂的查找、替换等处理要求,比字符串自身提供的方法提供了更强大的处理功能。
正则表达式在文本编辑与处理、网页爬虫之类的场合中有重要应用。
正则表达式由元字符及其不同组合来构成,通过巧妙地构造正则表达式可以匹配任意字符串,并完成查找、替换、分隔等复杂的字符串处理任务。
‘[a-zA-Z0-9]‘?
元字符 | 功能说明 |
---|---|
. | 匹配除换行符以外的任意单个字符 |
* | 匹配位于*之前的字符或子模式的0次或多次出现 |
+ | 匹配位于+之前的字符或子模式的1次或多次出现 |
- | 在[]之内用来表示范围 |
| | 匹配位于|之前或之后的字符 |
^ | 匹配行首,匹配以^后面的字符开头的字符串 |
$ | 匹配行尾,匹配以$之前的字符结束的字符串 |
? | 匹配位于?之前的0个或1个字符。当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o” |
\ | 表示位于\之后的为转义字符 |
\num | 此处的num是一个正整数,表示子模式编号。 例如,“(.)\1”匹配两个连续的相同字符 |
\f | 换页符匹配 |
\n | 换行符匹配 |
元字符 | 功能说明 |
---|---|
\r | 匹配一个回车符 |
\b | 匹配单词头或单词尾 |
\B | 与\b含义相反 |
\d | 匹配任何数字,相当于[0-9] |
\D | 与\d含义相反,等效于[^0-9] |
\s | 匹配任何空白字符,包括空格、制表符、换页符,与?[?\f\n\r\t\v]?等效 |
\S | 与\s含义相反 |
\w | 匹配任何字母、数字以及下划线,相当于[a-zA-Z0-9_] |
\W | 与\w含义相反\w含义相反,与“[^A-Za-z0-9_]”等效 |
() | 将位于()内的内容作为一个整体来对待 |
{m,n} | {}前的字符或子模式重复至少m次,至多n次 |
[] | 表示范围,匹配位于[a-z]中的任意一个字符 |
[^xyz] | 反向字符集,匹配除x、y、z之外的任何字符 |
[a-z] | 字符范围,匹配指定范围内的任何字符 |
[^a-z] | 反向范围字符,匹配除小写英文字母之外的任何字符 |
正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体对待,例如‘(red)+‘可以匹配‘redred‘、‘redredred‘等一个或多个重复‘red‘的情况。
使用子模式扩展语法可以实现更加复杂的字符串处理功能。
语法 | 功能说明 |
---|---|
(?P |
为子模式命名 |
(?iLmsux) | 设置匹配标志,可以是几个字母的组合,每个字母含义与编译标志相同 |
(?:...) | 匹配但不捕获该匹配的子表达式 |
(?P=groupname) | 表示在此之前的命名为groupname的子模式 |
(?#...) | 表示注释 |
(?<=…) | 用于正则表达式之前,表示如果<=后的内容在字符串中不出现则匹配,但不返回<=之后的内容 |
(?=…) | 用于正则表达式之后,表示如果=后的内容在字符串中出现则匹配,但不返回=之后的内容 |
(?<!...) | 用于正则表达式之前,表示如果<!后的内容在字符串中不出现则匹配,但不返回<!之后的内容 |
(?!...) | 用于正则表达式之后,表示如果!后的内容在字符串中不出现则匹配,但不返回!之后的内容 |
Python标准库re模块提供了正则表达式操作所需要的功能。
方法 | 功能说明 |
---|---|
compile(pattern[,?flags]) | 创建模式对象 |
escape(string) | 将字符串中所有特殊正则表达式字符转义 |
findall(pattern,?string[,?flags]) | 返回包含字符串中所有与给定模式匹配的项的列表 |
finditer(pattern,?string,?flags=0) | 返回包含所有匹配项的迭代对象,其中每个匹配项都是match对象 |
fullmatch(pattern,?string,?flags=0) | 尝试把模式作用于整个字符串,返回match对象或None |
match(pattern,?string[,?flags]) | 从字符串的开始处匹配模式,返回match对象或None |
purge() | 清空正则表达式缓存 |
search(pattern,?string[,?flags]) | 在整个字符串中寻找模式,返回match对象或None |
split(pattern,?string[,?maxsplit=0]) | 根据模式匹配项分隔字符串 |
sub(pat,?repl,?string[,?count=0]) | 将字符串中所有与pat匹配的项用repl替换,返回新字符串,repl可以是字符串或返回字符串的可调用对象,作用于每个匹配的match对象 |
subn(pat,?repl,?string[,?count=0]) | 将字符串中所有pat的匹配项用repl替换,返回包含新字符串和替换次数的二元元组,repl可以是字符串或返回字符串的可调用对象,作用于每个匹配的match对象 |
import re
telNumber = "My tel: 0234-1234675,your tel: 023-1223344, his tel: 034-23456"
pattern = r"(\d{3,4})-(\d{3,8})"
for item in re.findall(pattern, telNumber):
print("-".join(item))
import re
phone = "2004-959-599 #这是一个电话号码"
num = re.sub("#.*$","", phone)
print(num)
num = re.sub("\D","", phone)
print(num)
原文:https://www.cnblogs.com/sinlearn/p/12892246.html