re模块匹配字符简单实用

re.match() 从头找一个

re.search() 找一个**
re.findall() 找所有
**返回一个列表,没有就是空列表

re.findall('\d','chuan1zhi2')    结果为['1','2']

re.sub() 替换

re.sub('\d','_','chuan1zhi2')   结果为['chuan_zhi_']

re.compile(编译)**
返回一个模型p,具有和re一样的方法,但是传递的参数不同
匹配模式需要传到compile中
**如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将’\n’当作一个普通的字符加入到这个字符串中,在整体中进行匹配。

p=re.compile('\d',re.S)
p.findall('chuan1zhi2')

匹配中文**
在某些情况下,我们想匹配文本中的汉字,有一点需要注意的是,中文的unicode编码范围主要在[u4e99-u9fa5],这里说主要是因为这个范围并不完整,比如没有包括全角(中文)标点,不过,在大部分情况下,应该是够用的。
**假设现在想把字符串 title=u’你好,hello,世界’ 中的中文提取出来,可以这么做:

import re
title=u'你好,hello,世界'
pattern=re.compile('[\u4e99-\u9fa5]+')
result=pattern.findall(title)
print(result)
findall模块使用
import re
s='abcasdc'
r=re.findall('ab.*?c',s)
r

结果为:abc

不加问号结果为
abcasdc

加了问好是非贪婪匹配


import re
s='abcasdc'
r=re.findall('ab(.*)c',s)
r

结果为casd

加了括号只匹配出括号内的内容
如果有多个括号  结果是以元祖的形式,外面套个[]


用了findall,结果都是一个列表

re.sub()  替换

re.sub('\d','_','chuan1zhi2')   结果为['chuan_zhi_']
匹配规则
规则解释
\d** 匹配任何十进制数;它相当于类 [0-9]**
\D**匹配任何非数字字符;它相当于类 ****0-9**
\s** 匹配任何空白字符;它相当于类 [ fv]。**
\S** 匹配任何非空白字符;它相当于类**^** fv**^
\w匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W** 匹配任何非字母数字字符;它相当于类 ****a-zA-Z0-9_**
******* 匹配前面的子表达式零次或多次;{0,}**
+** 匹配前面的子表达式一次或多次;{1,}**
匹配前面的子表达式零次或一次;{0,1}
什么是正则表达式的贪婪与非贪婪匹配

**  如:**

String str="abcaxc";

Patter p="ab.*c";

**  贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.c)。*

**  非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab.c)。*

2.编程中如何区分两种模式

**  默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。**

**  量词:{m,n}:m到n个**

**     :任意多个*

**     +:一个到多个**

**     ?:0或一个**

注意括号
import re

string="abcdefg  acbdgef  abcdgfe  cadbgfe"

#带括号与不带括号的区别
#不带括号
regex=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
#输出:[('abcdefg  acbdgef', 'abcdefg'), ('abcdgfe  cadbgfe', 'abcdgfe')]

regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
#输出:['abcdefg', 'abcdgfe']

regex2=re.compile("\w+\s+\w+")
print(regex2.findall(string))
#输出:['abcdefg  acbdgef', 'abcdgfe  cadbgfe']

复制代码**
****第一个 regex 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple **

第二个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。

第三个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。


结论:findall()返回的是括号所匹配到的结果(如regex1),多个括号就会返回多个括号分别匹配到的结果(如regex),如果没有括号就返回就返回整条语句所匹配到的结果(如regex2)。所以在提取数据的时候就需要注意这个坑。

**   实际上是由其并不是python特有的,这是 正则 所特有的 , 任何一门高级语言使用正则都满足这个特点:有括号时只能匹配到括号中的内容,没有括号【相当于在最外层增加了一个括号】。在正则里面 “()” 代表的是分组的意思,一个括号代表一个分组,你只能匹配到"()"中的内容**

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值