Python_基础_(正表达式)

一,正则表达式

 普通的匹配都为完全匹配

正则表达式为模糊匹配

## 元字符

  . ^ $ * + ? {} [] ()

### .:一个点代表匹配一个字符
>>> re.findall("he..o","abchelloabc")
['hello']
>>>

### ^:在字符串的开头进行匹配,
>>> re.findall("^hello","ahello")
[]
>>> re.findall("^hello","helloabc")
['hello']
>>>

### $:以什么进行结尾
>>> re.findall("hello$","abchello")
['hello']
>>>

### *:按着挨着的字符进行重复(0~无穷)
>>> re.findall("o*","helloworldoooooaooo")
['', '', '', '', 'o', '', 'o', '', '', '', 'ooooo', '', 'ooo', '']
>>>

### +:按着挨着的字符进行重复(1~无穷) 至少有一个,贪婪匹配
>>> re.findall("o+","helloworldoooooaooo")
['o', 'o', 'ooooo', 'ooo']
>>>
>>> re.findall("hello+","helloworldoooooaooo")
['hello']
>>>

### ?:按着挨着的字符进行重复(1~0)    ,最多为1个
>>> re.findall("o?","helloworldoooooaooo")
['', '', '', '', 'o', '', 'o', '', '', '', 'o', 'o', 'o', 'o', 'o', '', 'o', 'o', 'o', '']
>>>
>>> re.findall("hello?","helloworldoooooaooo")
['hello']
>>>

{}:可以表示前面三种的情况
    {0,} == *
    {1,} == +
    {0,1} == ?
    
    {6}表示可以重复6次
    {1,6}表示可以重复1~6中任意的次数

### 将贪婪匹配变成惰性匹配,
### 在原本*号的后面加上一个?,将贪婪匹配变成惰性匹配
>>> re.findall("hello*?","abchelloabc")
['hell']
>>>
>>> re.findall("hello+?","abchelloabc")
['hello']
>>>

# 元字符集[]
>>> re.findall("x[yz]","xyssssssxzjxpjjjj")
['xy', 'xz']
>>>
 
>>> re.findall("x[yzp]","xyssssssxzjxpjjjj")
['xy', 'xz', 'xp']
>>>


注:元字符集中的符号大多数为普通符号 如 *  + ?
### 元字符集中有特殊意义的为 - ^ 
### 一个星只匹配一个符号
>>> re.findall("g[e*x]","fefefalgeeexxxx")
['ge']
>>>

### []与-
#[a-z]匹配a~z中的一个元素
>>> re.findall("g[a-z]","feaafgua")
['gu']
>>>

>>> re.findall("g[a-z]*","feaafgua")
['gua']
>>>

### [0-9]匹配0~9
>>> re.findall("g[0-9]*","abcg123")
['g123']
>>>

### []与^与-
### 注:^表示的是非的意思
### 匹配非0~9的字符
>>> re.findall("g[^0-9]","feaafgua")
['gu']
>>>

### 匹配非a~z的字符
>>> re.findall("g[^a-z]*","feaafg4415ua")
['g4415']
>>> re.findall("g[^a-z]*","feaafg44s15ua")
['g44']
>>>

### 元字符转义字符 

### d 匹配任何的十进制数
>>> re.findall("d","12+(23+34)")
['1', '2', '2', '3', '3', '4']
>>> re.findall("d+","12+(23+34)")
['12', '23', '34']
>>>

### D 匹配任何非数字字符
>>> re.findall("D","12+(23+34)")
['+', '(', '+', ')']
>>>

### s 匹配任何空白字符
>>> re.findall("s","hello world")
[' ']
>>>

### S 匹配任何非空白字符
>>> re.findall("S","hello world")
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
>>> re.findall("S+","hello world")
['hello', 'world']
>>>

### w 匹配任何字母,数字字符    相当于a-z  A-Z  0-9
>>> re.findall("w","hello world111")
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '1', '1', '1']
>>> re.findall("w+","hello world111")
['hello', 'world111']
>>>

>>> re.findall("w+","hello world111_+")
['hello', 'world111_']
>>>

### W 匹配任何非数字,非字母字符
>>> re.findall("W","abc123?._")
['?', '.']
>>>


###  匹配一个特殊字符边界,比如空格 & # 
>>> re.findall(r"I","hello I am LIST")
['I']
>>>
>>> re.findall("I\b","hello I am LIST")
['I']
>>>
### 元字符之|
|:俗称管道符
>>> re.findall("ka|b","asdffka|b")
['ka', 'b']
>>> re.findall("ka|b","asdffkab")
['ka', 'b']
>>>

### 元字符之分组()
注:search()    # 匹配字符串,只要匹配到一个就不再往下匹配
>>> re.findall("d+","fadf55adfa85af58")
['55', '85', '58']

>>> re.search("d+","fdfd58fdfd11df5df")
<_sre.SRE_Match object at 0x028EFA68>    # 得到的是一个对象
>>> re.search("d+","fdfd58fdfd11df5df").group()    # 利用group得出结果
'58'
>>>

>>> re.search("[a-z]+","123hello123abc").group()
'hello'
>>>

   
### (?P<id>[a-z]+)自定义一个分组,分组名称为id
>>> re.search("(?P<id>[a-z]+)","123hello123abc").group()
'hello'
>>>

>>> re.search("(?P<id>[a-z]+)d","123hello123abc").group()
'hello1'
>>>

>>> re.search("(?P<id>[a-z]+)d+","123hello123abc").group()
'hello123'
>>>

>>> re.search("(?P<id>[a-z]+)d+","123hello123abc").group("id")
'hello'
>>>

## r

re.findall(r"I","hello I am LIST")

上方代码中 r 表示的作用:加上r表示对所处理的字符不做任何的转义,因为Python在进行解释时,会对转义字符进行转义,而re模块也会对转义字符进行转义,所以会照成干扰,加上r后,Python不对其进行转义,直接让re模块进行解释

\b:Python对程序进行解释时,将其转义为,而后re模块对其进行解释,re表达式只能认为是 

r"\b":Python对程序进行解释时,不进行转义,而直接给re模块进行处理

# 一种不使用 r 的方法
re.findall("c\\l")
python对其进行转义,转义成c\l
# 而后re对其再次进行转义,转义成cl
# 所以将\\转义成
>>> re.findall("I\\l","hello I am LIlST")
['I\l']
>>>
# 注:上方的结果为两个反斜杠,因为返回到python中时又添加了一个,表示

. 表示一个普通点
* 表示一个普通*

## re中常用的方法

#1
findall

#2
search

#3
match("a","abc").group()    # 用法与search,不同于match只取头

#4
>>> re.split("[ab]","abcd")    # 先按a进行分割,得到''和'bcd',再将''和'bcd’按b进行分割
['', '', 'cd']

#5
sub替换,具有三个参数
>>> re.sub("d+","A","hello1998World")    # 将其中的数字替换为A 
'helloAWorld'

>>> re.sub("d","A","hello1998World")    # 将其中的每个数字替换为A
'helloAAAAWorld'

>>> re.sub("d","A","hello1998World",2)        # 后加参数2,匹配前两个数字
'helloAA98World'

#6
>>> re.subn("d","A","hello1998World")        # 输出匹配后的内容与匹配的次数
('helloAAAAWorld', 4)

#7
com = re.compile("d")    
# 将要匹配的规则存到com中
# 可以重复使用com

>>> com = re.compile("d")
>>> com.findall("dfadfd1fwe33adf")
['1', '3', '3']

#8
>>> re.finditer("d+","efwerfqw1212rtfgwe4454")
<callable-iterator object at 0x03008170>
>>>
# 与findall区别是返回一个迭代器对象
# 好处:当处理大量数据是,不需要将所有的数据全部存放到内存中,而是存放到迭代器中
>>> ret = re.finditer("d+","efwerfqw1212rtfgwe4454")
>>> next(ret).group()    # 用next读取
'1212'
>>> next(ret).group()
'4454'
>>>

# 注注:当使用分组时,re默认会将括号中分组的内容优先拿出,如下所示
>>> re.findall("www.(baidu|sina).com","www.baidu.com")
['baidu']

# 去优先级:加上?:
>>> re.findall("www.(?:baidu|sina).com","www.baidu.com")
['www.baidu.com']
# 补充
>>> re.findall("(abc)+","abcabcabc")    # 括号有优先级,只显示一个
['abc']
>>> re.findall("(?:abc)+","abcabcabc")    # 用?:取消优先级
['abcabcabc']
原文地址:https://www.cnblogs.com/Doaoao/p/10139833.html