. | 匹配任意除换行符“\n”外的字符 |
---|---|
\ | 转义字符,使用后一个字符改变原来的意思 |
[..] | 字符集 |
\d | 数字:[0-9] |
---|---|
\D | 非数字:[^\d】 |
\s | 空白字符:[ <空格> \t\r\n\f\v] |
\S | 非空白字符:[^\s】 |
\w | 单词字符:[A-Za-z0-9] |
\W | 非空白字符:[^w |
* | 匹配前一个字符0词或无限次 |
---|---|
+ | 匹配前一个字符1次或者无限次 |
? | 匹配前一个字符0次或1次 |
{m} | 匹配前一个字符m次 |
{m,n} | 匹配前一个字符m至n次 |
^ | 匹配字符串开头 |
---|---|
$ | 匹配字符串结尾 |
\A | 仅匹配字符串开头 |
\Z | 仅匹配字符串结尾 |
\b | 匹配\w和\W之间 |
\B | [^B] |
\ | 表明表达式任意匹配一个 |
---|---|
(..) | 被括起来的表达式将做为分组 |
[^..…] | 匹配除了这组字符之外的字符 |
正则表达式一般用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也多是默认非贪婪),老是尝试匹配尽量多的字符;非贪婪的则相反,老是尝试匹配尽量少的字符。例如:正则表达式”ab”若是用于查找”abbbc”,将找到”abbb”。而若是使用非贪婪的数量词”ab?”,将找到”a”。html
注:咱们通常使用非贪婪模式来提取。python
与大多数编程语言相同,正则表达式里使用””做为转义字符,这就可能形成反斜杠困扰。假如你须要匹配文本中的字符””,那么使用编程语言表示的正则表达式里将须要4个反斜杠”\\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。正则表达式
Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可使用r”\”表示。一样,匹配一个数字的”\d”能够写成r”\d”。有了原生字符串,妈妈也不用担忧是否是漏写了反斜杠,写出来的表达式也更直观勒。编程
findall:
匹配全部内容,造成一个列表,每一项都是列表中的一个元素s = 'https://ygdy8.com/html/gndy/dyzz/20191022/59284.html">2019年悬疑恐怖《暗战》BD韩<|' #`findall`匹配全部内容,造成一个列表,每一项都是列表中的一个元素 res = re.findall('com(.*?)5928',s) print(res) #['/html/gndy/dyzz/20191022/']
search:只匹配符合条件的从左到右的第一个,获得的不是直接结果,而是一个变量,经过此变量的group方法来得到最后结果,若是没有匹配到符合条件的,则会返回None,使用group会报错编程语言
res = re.search('com(.*?)5928',s) print(res.group()) #com/html/gndy/dyzz/20191022/5928
match:从头开始匹配,至关于search中的正则表达式加上一个"^"code
res = re.match('[a-z]{3}',s) print(res.group()) #htt
split:切割,返回列表****htm
res = re.split('\d+',s) print(res) #['https://ygdy', '.com/html/gndy/dyzz/', '/', '.html">', '年悬疑恐怖《暗战》BD韩<|']
sub:切换(旧,新,对象,替换次数)对象
res = re.sub('\d','*',s) print(res) #https://ygdy*.com/html/gndy/dyzz/********/*****.html">****年悬疑恐怖《暗战》BD韩<|
subn:也是替换,不过会返回一个元组,元组中第一个元素是替换后的结果,第二个参数是替换的次数内存
res = re.subn('\d','*',s) print(res) #('https://ygdy*.com/html/gndy/dyzz/********/*****.html">****年悬疑恐怖《暗战》BD韩<|', 18)
s = 'https://ygdy8.com/html/gndy/dyzz/20191022/59284.html">2019年悬疑恐怖《暗战》BD韩<|' ret = re.compile('\d+') #已经完成编译了 res = ret.findall(s) #拿来直接用 print(res) #['8', '20191022', '59284', '2019']
finditer
:节省使用正则表达式解决问题的空间,也就是内存字符串
ret = re.finditer('\d+',s) for i in ret: print(i.group()) #8 #20191022 #59284 #2019
正则表达式的分组在re模块中的使用
s = '<a>wahahafsdfsfdafsaafs</a>' #标签语言HTML网页 ret = re.search('(<\w+>)(\w+)(</\w+>)',s) print(ret.group()) #<a>wahahafsdfsfdafsaafs</a> 全部结果 print(ret.group(1)) #<a> 数字参数表明的是取对应分组中的内容 第一个分组中的 print(ret.group(2)) #wahahafsdfsfdafsaafs 第二个分组中内容 print(ret.group(3)) #</a>
s = '<a>wahahafs</a>' ret = re.findall('(\w+)',s) print(ret) #['a', 'wahahafs', 'a'] res = re.findall('>(\w+)<',s) #优先寻找匹配括号中的内容 print(res) #['wahahafs']
ret = re.findall('\d+(\.\d+)','1.234*4') print(ret) >>> ['.234'] ret = re.findall('\d+(?:\.\d+)','1.234*4') #取消了分组优先 print(ret) >>> ['1.234']