Re一些规则
正则表达式在很多地方都是非常有用的,比如在写网络爬虫的时候,提取元素或者提取网址的时候有很大的作用。而正则表达式常用于字符串操作
字符匹配
1.元字符的完整列表:. ^ $ * + ? { [ ] \ | ( )
匹配“a,b,c中的一个字符”:[abc] 或者 [a-c]
2.一些常用的特殊符号
\d 匹配任何十进制数,相当于[0-9]
\D 匹配任何非数字字符,相当于[^0-9]
\s 匹配任何非空白字符,相当于[\t\n\r\f\v....]
\S 匹配任何非空白字符,相当于[^ \t\n\r\f\v...]
\w 匹配任何字母数字字符,相当于[a-zA-Z0-9]
\W 匹配任何非字母数字字符,相当于[^a-zA-Z0-9]
3.重复
- “*”前一个字符可以被匹配零次或更多次,而不是只有一次
{m,n}限定符,表示至少有m个重复、至多有n个重复.
eg. re.match(r'a/{2,4}b',a//b)=true re.match(r'a/{2,4}b',a/b)=false
python使用正则表达式
RegexObject实例:
方法/属性 | 作用 |
---|---|
match() | 决定re是否在字符串刚开始的位置匹配 |
search() | 扫描字符串,找到这个re匹配的位置 |
findall() | 找到re匹配的子串,并把它们作为一个列表返回 |
finditer() | 找到re匹配的所有子串,并把它们作为一个迭代器返回 |
MatchObject实例:
方法/属性 | 作用 |
---|---|
group() | 返回被re匹配的字符串 |
start() | 返回匹配开始的位置(索引) |
end() | 返回匹配结束的位置(索引) |
span() | 返回一个元组包含匹配(开始,结束)的位置 |
eg.
p = re.compile('\d+')
p.findall('1 hello,2 byebye,3 yes,4 no')
>>>['1','2','3','4']
一些提醒:
[^abc]
表达的意思是匹配除了abc的任何一个字符;但是如果是^abc
则表达的意思是匹配以‘abc‘开始的字符串
match()
函数只检查re是否在字符串开始处匹配,而research()
则是扫描整个字符串。如果匹配不是从字符串的位置0处开始的,match()将不会报告它。
From (\S+@\S+)
表达的意思是从From开始匹配,但是提取的时候只提取括号内的内容。
贪婪匹配
默认的为贪婪匹配,意思是:
#我想匹配From:,所以可以用^F.+:进行匹配
p = re.match(r'^F.+:','From: using : it is')
print(p)
>>>From: using :
从上述例子可以看出,一般匹配的时候都采用了贪婪匹配,即满足匹配规则的最长字符串;为了避免这个,需要将匹配规则写成‘r‘^F.+:?‘,其中?就是不进行贪婪匹配。
修改字符串
方法/属性 | 作用 |
---|---|
split() | 将字符串在re匹配的地方分片并生成一个列表 |
sub() | 找到re匹配的所有子串,并将其用一个不同的字符串替换 |
subn() | 与sun()相同,但返回新的字符串和替换次数 |
将字符串分片split()
p = re.compile(r'\W+')
p.split('This is a test')
>>> ['This','is','a','test','']
更高级一点的分片
往往我们需要的可能只是一个字符串里的字母或者数字,即相关数据提取;所以我们对于一些符号需要进行排除p.split(r‘(\s\,\.\#\\)ab*‘)
, 这样的格式就可以将一些符号进行排除,只正确分片出我们所需呀的关键信息。
搜索和替换sub()
sub(replacement,string[,count = 0])
返回的字符串是在字符串中用re最左边不重复的匹配来替换,如果模式没有被发现,字符将被没有改变的返回。可选参数count是模式匹配后替换的最大次数;count必须是非负整数。缺省值是0表示替换所有的匹配。
eg.
p = re.compile('(blue|white|red)'))
p.sub('colour','blue socks and red shoes')
>>>colour socks and colour shoes.
p.sub('colour','blue socks and red shoes',count = 1)
>>>colour socks and red shoes
邮箱验证
虽然没有统一的邮箱账号格式,但是所有邮箱都符合“名称@域名”的规律。对于名称和域名的字符限制,我们可以根据项目的情况定义一个,比如只允许有英文、数字、下划线等组成。
举例:zhangsan-001@gmail.com
分析邮件名称部分
- 26个大小写英文字母表示为a-zA-Z
- 数字表示为0-9
- 下划线表示为_
- 中划线表示为-
- 由于名称是由若干个字母、数字、下划线和中划线组成,所以需要用到+表示多次出现
所以根据以上条件得出邮件名称表达式:[a-zA-Z0-9_-]+
由于邮箱的基本格式为“名称@域名”,需要使用“^”匹配邮箱的开始部分,用“$”匹配邮箱结束部分以保证邮箱前后不能有其他字符,所以最终邮箱的正则表达式为:
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$