天天看点

python中的re模块

"""
re模块各方法区别
search:若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个
findall:返回string中所有与pattern相匹配的全部字串,返回形式为数组。
finditer:返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。
"""


import re
# 需要匹配的字符串
string = '12abc45'
result = re.search(pattern='abc', string=string)
print(result)
# 获取匹配到的子字符串
print(result.group())
result = re.search(pattern='2a', string=string)
print(result)


# .: 匹配任意字符,\n 除外
result = re.search(pattern='.', string=string)
print(result)

# [7a] 匹配7或者a
string = '127bc45'
result = re.search(pattern='[7a]', string=string)
print(result)

string = 'cccc'
result = re.search(pattern='\d', string=string)
print(result)

# *: 匹配某个字符零次->无限次
string = 'a7abc45'
result = re.search(pattern='a*', string=string)
print(result)


# *: 匹配某个字符零次->无限次
# 贪婪模式 vs 非贪婪模式
# Python使用正则表达式:贪婪模式。
string = 'a7abc45'
result = re.search(pattern='.*', string=string)
print(result)

# 启用非贪婪模式?
string = 'a7abc45'
result = re.search(pattern='.*?', string=string)
print(result)      
# 需要匹配 #mobile_phone# #pwd#

string = '{"member_id":"#pwd#","amount":#money#}'
import re
# result = re.search('#.*?#', string)
# print(result)

# 分组
result = re.search('#(.*?)#', string)
print(result)

# result.group() 正则表达式匹配到的整个结果
print(result.group(0))  #  #pwd#
# result.group(1) :结果当中第一个括号里面的内容,
# result.group(2), 第二个括号里面的内容
print(result.group(1))      
string = '{"member_id":"#pwd#","amount":#money#}'


class Data:
    pwd = '123456'
    money = 100

# 方法一:if

# 方法二: 正则表达式 re.search, re.finditer


import re

result = re.finditer('#(.*?)#', string)
for el in result:
    # el 匹配到的每个数据
    # print(el.group())
    # print(el.group(1)) # pwd
    # 字符串替换, replace
    old = el.group()  # #pwd#
    prop_name = el.group(1)  # pwd
    string = string.replace(old,  str(getattr(Data, prop_name)) )

print(string)

# 1, getattr()
# 2, re.finditer()
# 3, .*?
# 4, group(), group(1)