python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python标准库re使用

Python标准库re的使用举例(正则化匹配)

作者:宋建国

正则表达式re是内置函数,通过一定的匹配规则获取指定的数据,下面这篇文章主要给大家介绍了关于Python标准库re的使用举例,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

常用正则表达式

正则表达式                                                              描述                                    匹配结果
\d+(\.\d*)?                                                       任意整数和浮点数                            0.004 2 75.

\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b                                      首字母只能大写                               Boo Foo

^http:\/\/([\w-]+(\.[\w-]+)+(\/[\w-.\/\?%&=\u4e00-\u9fa5]*)?)?$      验证网址                           http://www.baidu.com/?id=1

^[\u4e00-\u9fa5]{0,}$                                                验证汉字                                 汉字汉字

\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*                       验证电子邮件                             example@163.com

^[1-9]([0-9]{16}|[0-9]{13})[xX0-9]$                                 验证身份证                            14525419951215445X

^13[0-9]{1}[0-9]{8}|^15[9]{1}[0-9]{8}                               验证手机号                             138459572***

^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])          验证IP                             192.168.1.1
\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)
\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)
\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$	

^[a-zA-Z0-9]+([a-zA-Z0-9\-\.]+)?\.s|)$                                验证域名                                baidu.com

^([a-zA-Z]\:|\\)\\([^\\]+\\)*[^\/:*?"<>|]+\.txt(l)?$               验证文件路径	                             C:\user\wo

<(.*)>(.*)<\/(.*)>|<(.*)\/>                                        HTML标签匹配(需修改)                          xxxx

一,必备知识

1.修饰符(flag)

re.I  使匹配对大小写不敏感
re.L  做本地化识别匹配
re.M  多行匹配,影响^和$
re.S  使.匹配包括换行在内的所有字符
re.U  根据Unicode字符集解析字符.这个标志影响\w \W \b \B
re.X  该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解.

# 例子 result = re.match('^The.*?(\d+).*?phone.', content, re.S)

2.匹配模式

^          匹配字符串开头
$          匹配字符串结尾
.          匹配人以字符,除了换行符号.当re.DOTAALL标记被指定时,则可以匹配包括换行符的任意字符.
[...]      用来表示一组字符,单独列出:[amk]匹配a,m或k
[^...]     不在[]中的字符:[^amk]匹配除amk之外的字符
re*        匹配0个或多个的表达式
re+        匹配1个或多个的表达式
re?        匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式.
re{n}      精准匹配n个前面表达式
re{n,}     匹配大于等于n个前面表达式
re{n,m}    匹配n到m个前面的表达式定义的片段,贪婪方式
a|b        匹配a或b
(re)       对正则表达式分组,并记住匹配的文本
(?imx)     正则表达式包含三种可选标志,imx,只影响括号中的区域.
(?-imx)    正则表达式关闭imx可选标志,只影响括号中的区域.
(?:re)     类似(...)但不表示一个组
(?imx:re)  在括号中使用imx可选标志
(?-imx:re) 在括号中不是用imx可选标志
(?#...)    注释
(?=re)     前向肯定界定符.如果所含正则表达式,以...表示,在当前位置成功匹配时成功,否则失败.但一旦所含表达式已经尝试,匹配引擎根本没有提高,模式的剩余部分还要尝试界定符右边.
(?!re)     前向否定界定符.与肯定界定符相反;当所含的表达式不能在字符串当前位置匹配成功时成功.
(?>re)     匹配的独立模式,省去回朔.
\w         匹配字符数字以及下划线
\W         匹配非字母数字下划线
\s         匹配任意空白字符,等价于[\t\n\r\f]
\S         匹配任意非空白字符
\d         匹配任意数字
\D         匹配任意非数字
\A         匹配字符串开始
\Z         匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串.
\z         匹配字符串结束
\G         匹配最后匹配完成的位置
\b         匹配一个单词边界,也就是指单词和空格之间的位置
\B         匹配非单词边界
\n \t      匹配一个换行符,一个制表符
\1...\9    匹配第n个分组的内容

3. r的作用

正则表达式使用反斜杠来表示特殊形式,或者把特殊字符转义成普通字符

反斜杠在普通的 Python 字符串里也有相同的作用,所以就产生了冲突

解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 ‘r’ 前缀的字符串字面值中,反斜杠不必做任何特殊处理

import re

if re.search(r'\\d', 'I have one nee\dle') is not None:
    print('match it',re.search(r'\\d', 'I have one nee\dle').group(0))
else:
    print('not match')

# match it \d

4. 贪婪与非贪婪—通配符后面加?

在贪婪匹配下,.* 会匹配尽可能多的字符

正则表达式中.*后面是\d+,也就是至少一个数字,并没有指定具体多少个数字,因此,.*就尽可能匹配多的字符,这里就把12345匹配了,给\d+留下个可满 足条件的数字 6.最后得到的内容就只有数字6了

import re

content = 'The 123456 is my one phone number.'
print('贪婪匹配:')
result = re.match(r'^The.*(\d+).*', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
print(result.group()) #输出匹配内容
print('result = %s'%result.group(1)) #输出第一个被()包裹的内容

print('-'*20)

print('非贪婪匹配:')
result = re.match(r'^The.*?(\d+).*', content) 
print(result.group())
print('result = %s'%result.group(1))

# 贪婪匹配:
# The 123456 is my one phone number.
# result = 6
# --------------------
# 非贪婪匹配:
# The 123456 is my one phone number.
# result = 123456

5.转义匹配的使用

由于()属于正则表达式的特殊字符, 因此在需要匹配()时, 需要加上转义字符\.

import re

content = '(百度)www.baidu.com'
result = re.match('(百度)www.baidu.com', content)
result2 = re.match('\(百度\)www\.baidu\.com', content)
if result:
    print(result.group())
else:
    print('result = None')
if result2:
    print(result2.group())
else:
    print('result2 = None')

# result = None
# (百度)www.baidu.com

6. group(num = 0)和groups( )

二,函数应用

1. re.compile(pattern,flags=0)—自定义匹配模板

import re

content1 = '2016-1-1 12:01'
content2 = '2017-1-1 12:02'
content3 = '2018-1-1 12:03'

pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)

#2016-1-1  2017-1-1  2018-1-1 

2. re.match(pattern,string,flags=0)—从第一个字符开始匹配

import re
regex = '(foo\w)(\w)'
m = re.match(r'(foo\w)(\w)','fooasdfooasd')
if m is not None:
    print(m.group(1))
    print(m.groups())

#输出
#fooa
#('fooa', 's')

3. re.search(pattern,string,flags=0)—不固定开始,但是只匹配第一个

import re
regex = '<(.*)>(.*)<\/(.*)>|<(.*)\/>'
m = re.search(regex,"aa<a>aaaa</a>")
#一样只有search能匹配到标签
if m is not None:
    print(m)
    print(m.group())

# 结果
# <re.Match object; span=(2, 13), match='<a>aaaa</a>'>
# <a>aaaa</a>

4. re.findall(pattern, string,[, flags])—匹配所有数据

import re
text = "I am so happy! "
array1 = re.findall("[a-zA-Z]", text)
array2 = re.findall("[a-zA-Z]+", text)
print(array1)
print(array2)

#结果
# ['I', 'a', 'm', 's', 'o', 'h', 'a', 'p', 'p', 'y']
# ['I', 'am', 'so', 'happy']

5. finditer(pattern, string,[,flags] )—返回的是匹配到的迭代器对象

与findall()相同,但返回的是一个迭代器。对于每一次匹配,迭代器都能返回一个匹配对象

import re
regex = 'apple'
m = [ g.group() for g in re.finditer(regex,'apple1 apple2 apple3')]
print(m)
#输出
#['apple', 'apple', 'apple']

6. split(pattern, string, max = 0)

根据正则表达式的模式分隔符,split函数将字符串分割为列表,返回匹配列表,分割最多操作max次

import re
list = [
'aaa,bbb,ccc',
'ddd,eee,fff',
]
for i in list:
    print(re.split(',',i))

# ['aaa', 'bbb', 'ccc']
# ['ddd', 'eee', 'fff']

7. re.sub(pattern, repl, string, count=0, flags=0)—可正则的字符串替换

替换字符串中的某些子串,可以用正则表达式来匹配被选子串。

pattern:表示正则表达式中的模式字符串;

repl:被替换的字符串(既可以是字符串,也可以是函数);

string:要被处理的,要被替换的字符串;

count:匹配的次数, 默认是全部替换

import re
st = "hello 2019"
st = re.sub("([0-9]+)","yudengwu",st)
print(st)

#结果
# hello yudengwu

8. str.replace(old, new,max)—不是re函数,仅用作字符串替换

import re
st = "我喜欢你,喜欢你"
st = st.replace("喜欢","爱",1)
print(st)

# 我爱你,喜欢你

总结

到此这篇关于Python标准库re的使用举例的文章就介绍到这了,更多相关Python标准库re使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文