正则表达式
一、元字符:
' . ' | 代表通配符,可以匹配到所有但是匹配不到 '\n' |
---|---|
' ^ ' | 代表在字符串开头匹配,在中括号里的意思是非,后面全部为非 |
' $ ' | 代表字符串结尾是匹配 |
' * ' | 匹配前面紧挨的字符,该字符可以出现多次(0--n) |
' ? ' | 匹配前面紧挨的字符0或1次 |
' | ' | 代表或 |
' + ' | 匹配前面紧挨的字符1--n次(贪婪匹配) |
' { } ' | 自定义匹配前面紧挨的字符出现次数 {0,} == ' * ' {0,1} == ' ? ' {1,} == '+' |
' [ ] ' | 匹配括号里面的内容或的关系选出1个,没有特殊字符,不需要转义 |
' () ' | 代表分组 -------> 有名分组 :(?P<表签名>\w+) 前面固定的写法,后面正则匹配规则. --->(?:表达式) 写在括号里代表去优先级 |
‘ \ ’ | 代表转义字符 |
转义字符的其他用法
\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_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
tips:在正则表达式里'\\' 代表一个'\', 每一个就需要匹配'\' 的需要4个'\'来进行匹配,因为操作系统两个'\\' 相当于'\',正则里面也是如此,正则式建立在操作系统之上,所以需要4个‘\’
二、re模块的用法
import re
# re.findall('匹配规则', '匹配字符串')
print(re.findall('csdn', 'asdacsdn546csdnads+')) # 将匹配结果放到列表中返回
>>> ['csdn', 'csdn']
# re.finditer('匹配规则', '匹配字符串')
print(re.finditer('csdn', 'asdacsdn546csdnads+')) # 将匹配结果放到迭代器中,节省内存
>>> <callable_iterator object at 0x0000029DA17BE160>
#re.sub(替换字符串,新字符,字符串,[前几次])
print(re.sub('1234','csdn', '1234')) # 替换字符串
>>> csdn
# re.subn(替换字符串,新字符,字符串)
print(re.subn('1234','csdn', '1234')) # 替换字符串,将匹配结果和次数元组返回
>>> ('csdn', 1)
# re.match(匹配规则, 匹配目标) # 只能在开头匹配
print(re.match('1234', '1234')) # 返回为一个对象,只能在开头匹配
print(re.match('1234', '1234').group()) # 加上group才能打印出值
>>><_sre.SRE_Match object; span=(0, 3), match='123'>
>>> 1234
# re.split(匹配规则, 匹配目标)
print(re.split('[ab]','abc')) 分割
>>>['','','c'] 先按括号里的分,分完后左边没有就是空,右边继续分
#re.serach(匹配规则, 匹配目标)
print(re.search('123','123')) # 返回为一个对象,只会找到第一个匹配成功的.
print(re.search('123','123').group())
>>> <_sre.SRE_Match object; span=(0, 3), match='123'>
>>> 123
# re.compile('匹配规则')
com = re.compile('123')
print(com.findall('123')) # 编辑 通过compile去调用其他的方法,就不用写规则
>>> 123
# 其他的姿势
print(re.search('(?P<name>\w)', '123').group('name')) # 前面写好的标签名,后面group调用
>>> 1
小项目 :计算器
import re
def none(value):
for item in ['\*', '\/', '\%', '\+', '\-']:
while 1:
# 检验是否符合表达式
aim = re.search('(\d+){}(\d+)'.format(item), value)
if aim:
new = item.lstrip('\\')
if new == '*':
result = int(aim.group(1)) * int(aim.group(2))
if new == '+':
result = int(aim.group(1)) + int(aim.group(2))
if new == '-':
result = int(aim.group(1)) - int(aim.group(2))
if new == '/':
result = int(aim.group(1)) / int(aim.group(2))
if new == '%':
result = int(aim.group(1)) % int(aim.group(2))
# 因为正则不认识'*',所以加'\'
a = aim.group(1) + item + aim.group(2)
value = re.sub(a, str(result), value)
else:
break
return str(value)
def not_none(value):
while 1:
aim = re.search('\([^()]*\)', value)
if aim:
# 将取出来的值去括号
raw = aim.group(0).lstrip('(').rstrip(')')
res = none(raw)
else:
break
# 替换字符串
value = value.replace(aim.group(0), res)
# value = re.sub(raw, res, value)
result = none(value)
return result
def sort(value):
# 判断算式有没有括号
if re.search('\(', value):
result = not_none(value)
print(result)
else:
result = none(value)
print(result)
def proof(value):
# 检验括号是否成对
left = len(re.findall('\(', value))
right = len(re.findall('\)', value))
if left != right:
print('error')
return False
# 验证没有字母出现
if len(re.findall('[a-zA-Z]+', value)) != 0:
print('error')
return False
# 验证没有运算符的输入错误
if len(re.findall('([+*-/%])+([+*-/%])+', value)) != 0:
print('error')
return False
# 防止有空格插入
new_value = value.replace(' ', '')
return new_value
def main():
value = input('please input')
new_value = proof(value)
sort(new_value)
if __name__ == '__main__':
main()