python re模块

一 正则表达式,又称规则表达式,英文名为Regular Expression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。实现过滤的功能。

  1元字符

    \w 匹配字母(包含汉字),数字,下划线

    \d 匹配十进制数字

    \s 匹配空白字符

    \n 匹配换行符

    \t 匹配制表符

    ^ 匹配字符串的开始

    $匹配字符串的末尾

    a|b 匹配a或者b

    [ ]字符集,只能取其中的一个。字符集只有三个特殊符号:^ : 取反,,例如[^a-z]    \ :例如 [\d]    - :例如 [a-z]

    [^.. ] 匹配除了字符集内所有的字符外的字符

  2 量词  

    每个量词只控制前一个字符的出现次数

    默认模式是贪婪匹配

    量词后面加?,为非贪婪匹配

    * 

    + 

    ? 

    { }

  3 惰性匹配

    ?

 

  举例:

    \d?? 第一个问号表示0个或1个,第二个问号表示惰性运算,取0个。

    .*? 取尽量少的任意字符。一般用在。*?x,表示取前面任意长度的字符,直到第一个x出现。

  4 ( ) 分组  对多个字符进行整体的量词约束

      | 或

 

二 re模块的方法

  1 findall,返回列表, 在findall中优先显示( )内的东西。(?:)取消优先级。

import re

print(re.findall('www.(baidu|google).com','www.baidu.com'))
print(re.findall('www.(?:baidu|google).com','www.baidu.com'))

  输出:

['baidu']
['www.baidu.com']

  

  2 match ,如果没有找到,返回值是None。如果不为空,调用返回值的group( )方法。

  3 search ,如果没有找到,返回值是None。如果不为空,调用返回值的group( )方法。

    针对match,seach,一般是这样用。

import re
res=re.match('\d+?','123abv')
if res:
    print(res.group())

  输出:1  

  4 split,切割。加上( ) ,保留被分割的对象。

print(re.split('\d','abc123qwe'))
print(re.split('(\d)','abc123qwe'))

  输出:

['abc', '', '', 'qwe']
['abc', '1', '', '2', '', '3', 'qwe']

  5 sub,替换,与字符串的replace方法一样,默认全部替换,同样也可以指定替换的个数。

import re
print(re.sub('\d','A','123abc',1))
print(re.sub('\d','A','123abc',))

  输出:

A23abc
AAAabc

  6 compile 将正则表达式编译成一个正则表达式对象。后面直接用正则表达式对象调用re模块方法,就可以了。

import re
obj=re.compile('\d+')
print(obj.match('123abv').group())

  输出: 123

  7 finditer 。

  返回的结果是一个迭代的。

  for循环遍历得到的元素,本质上是调用match方法得到的,所以然后调用元素的group( )方法。

import re
res=re.finditer('\d','abc123qwe')
print(res,type(res))
for i in res:
    print(type(i),i.group())

  输出:

<callable_iterator object at 0x000001C573FE6DA0> <class 'callable_iterator'>
<class '_sre.SRE_Match'> 1
<class '_sre.SRE_Match'> 2
<class '_sre.SRE_Match'> 3

  8 (?P< xxx>)的用法

import re
res=re.search('<(?P<tag>div id="logo".*?)>','<div id="ntp-contents"><div id="logo" title="Google"></div><div id="fakebox"><div id="fakebox-text"></div><input id="fakebox-input" autocomplete="off" tabIndex="-1" type="url"aria-hidden="true"><div id="cursor"></div>')
print(res.group('tag'))

  输出:

div id="logo" title="Google"

   9 re.S  含义:.可以匹配包括换行符在内的所有字符。

三 举例

  匹配小数    点是特殊字符,必须转义

import re
print(re.findall('\d+\.\d+','2.14'))

  匹配整数    解决了我的一个心头问题

import re
res=re.findall('\d+\.\d+|(\d+)','2.14,50,12')
while '' in res:
    res.remove('')
print(res)

 

四 关于group的说明。

  官方文档:https://docs.python.org/3.6/library/re.html#re.match.group

s = 'https://www.baidu.com?user=zuo&password=123'
res = re.search('\?(.*?)&(.+)',s)
# print(res)
print(res.group())
print(res.group(1))
print(res.group(2))
print(res.group(2,1))
print(res.group(1,2))

  输出:

?user=zuo&password=123
user=zuo
password=123
('password=123', 'user=zuo')
('user=zuo', 'password=123')

  group中的数字代表的是正则匹配是对应的第一个小括号!

 

posted @ 2017-09-11 16:50  骑者赶路  阅读(211)  评论(0编辑  收藏  举报