python中正则表达式的使用

正则表达式

python中需要使用正则表达式对字符串进行匹配的时候,需要导入re模块

 #coding=utf-8

    # 导入re模块
    import re

    # 使用match方法进行匹配操作
    result = re.match(正则表达式,要匹配的字符串)

    # 如果上一步匹配到数据的话,可以使用group方法来提取数据
    result.group()

匹配单个字符

. 匹配任意1个字符(除了\n)

import re

ret =re.match(r"haha.haha","hahaahaha")
print(ret.group())

输出结果
hahaahaha

[ ] 匹配 [ ] 中列举的字符

import re

ret = re.match("[0-9]Hello Python","7Hello Python")
print(ret.group())

输出结果
7Hello Python

\d 匹配数字,即0-9
\D 匹配非数字,即不是数字

import re

ret = re.match(r"\d","1Hello Python")
print(ret.group())

ret = re.match(r"\D","Hello Python")
print(ret.group())

输出结果
1
H

\s 匹配空白,即 空格,tab键
\S 匹配非空白

import re

ret = re.match(r"\s"," 1Hello Python")
print(ret.group())

ret = re.match(r"\S","Hello Python")
print(ret.group())

输出结果
 
H

\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符

import re

ret = re.match(r"\w","1Hello Python")
print(ret.group())

ret = re.match(r"\W","@Hello Python")
print(ret.group())

输出结果
1
@

匹配多个字符

“ * ” 匹配一个字符出现0次或者无限次,即可有可无

import re

ret = re.match("[A-Z][a-z]*","M")
print(ret.group())

ret = re.match("[A-Z][a-z]*","MnnM")
print(ret.group())

ret = re.match("[A-Z][a-z]*","Aabcdef")
print(ret.group())

输出结果
M
Mnn
Aabcdef

“ + ” 匹配一个字符出现一次或者无限次,即至少一次

import re

names = ["name1", "_name", "2_name", "__name__"]

for name in names:
    ret = re.match("[a-zA-Z_]+[\w]*",name)
    if ret:
        print("变量名 %s 符合要求" % ret.group())
    else:
        print("变量名 %s 非法" % name)


输出结果
变量名 name 符合要求
变量名 _name 符合要求
变量名 2_name 非法
变量名 __name__ 符合要求

" ? " 匹配一个字符出现一次或者0次

import re

ret = re.match("[1-9]?[0-9]","7")
print(ret.group())

ret = re.match("[1-9]?\d","33")
print(ret.group())

ret = re.match("[1-9]?\d","09")
print(ret.group())

输出结果
7
33
0

{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现m 到 n 次

import re

ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
print(ret.group())

ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
print(ret.group())


输出结果
12a3g4
1ad12f23s34455ff66

" ^ " 匹配字符串开头
" $ " 匹配字符串结尾

email_list = ["[email protected]", "[email protected]", "[email protected]"]

for email in email_list:
    ret = re.match("[\w]{4,20}@163\.com$", email)
    if ret:
        print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group()))
    else:
        print("%s 不符合要求" % email)

输出结果
[email protected] 是符合规定的邮件地址,匹配后的结果是:[email protected]
[email protected] 不符合要求
[email protected] 不符合要求

" | " 匹配左右任意一个表达式

import re
ret = re.match("[1-9]?\d$|100","78")
print(ret.group())

ret = re.match("[1-9]?\d$|100","100")
print(ret.group())

输出结果
78
100

(ab) 将括号中字符作为一个分组

import re
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]")
print(ret.group()) 

输出结果
[email protected]

\num 引用分组num匹配到的字符串

import re
test_label = "<html>hh</htmlbalabala>"
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", test_label)
if ret:
    print(ret.group())
else:
    print("%s 这是一对不正确的标签" % test_label)

输出结果
<html>hh</htmlbalabala> 这是一对不正确的标签

re模块的高级用法

match
匹配string 开头,成功返回Match object, 失败返回None,只匹配一个。
search
在string中进行搜索,成功返回Match object, 失败返回None, 只匹配一个。

import re

ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()

输出结果
'9999'

findall
在string中查找所有 匹配成功的组, 即用括号括起来的部分。返回list对象,每个list item是由每个匹配的所有组组成的list。

import re

ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)

输出结果
['9999', '7890', '12345']

sub
将匹配到的数据进行替换

import re

ret = re.sub(r"\d+", '998', "python = 997")
print(ret)

输出结果
python = 998

split
根据匹配进行切割字符串,并返回一个列表

import re

ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)

输出结果
['info', 'xiaoZhang', '33', 'shandong']

python贪婪和非贪婪

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

非贪婪则相反,总是尝试匹配尽可能少的字符。

在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。

>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
>>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1) 
'2343'
>>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
'2343'
>>>

r的作用

Python中字符串前面加上 r 表示原生字符串,

与大多数编程语言相同,正则表达式里使用"“作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

>>> ret = re.match(r"c:\\a",mm).group()
>>> print(ret)
c:\a

猜你喜欢

转载自blog.csdn.net/qq_41606973/article/details/83031423
今日推荐