Python实验八(正则表达式的使用)

课件程序居多,简单说明正则表达式

因为这个理解较为困难,如果注解有误,请及时联系我改正,后续会单独做一次正则表达式的解释说明。
一、正则表达式的基本语法
在这里插入图片描述
在这里插入图片描述
二、如果以“\”开头的元字符与转义字符相同,则需要使用“\”,或者使用原始字符串。
在字符串前加上字符r或R之后表示原始字符串,字符串中任意字符都不再进行转义(形如\d如不加r则需用\d区别转义)。原始字符串可以减少用户的输入,主要用于正则表达式和文件路径字符串的情况,但如果字符串以一个斜线“\”结束的话,则需要多写一个斜线,即以“\”结束。
1、写一个正则表达式判断一个字符串是否是ipv4地址。
规则:一个ip地址由4个数字组成,每个数字之间用.连接。每个数字的大小是0-255 例如:255.189.10.37 正确,256.189.89.9 错误。
**注:**该正则表达式的写法可通俗理解成对单个数字字符进行范围截取,分别讨论1、2、3位情况分别讨论进行组合。这里说一个(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]),其中()代指其中内容为一个整体,单独\d代指[0-9],"|“代指表或者[1-9]\d表示10-99,1\d{2}表示100-199,2[0-4]\d表示200-249,25[0-5]表示250-255,”.“表示转义字符,表示一个字符”."。表达式最开始用到区分转义,减少""的输入,便面混淆。

import re
re_str = r'((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])'
result = re.fullmatch(re_str,'255.183.10.37')
print(result)

2、使用正则表达式查找文本中最长的数字字符串。
**注:**课件程序,多多理解

import re
def longest1(s):
    t = re.findall('\d+',s)
    if t:
        return max(t,key = len)
    return -1
def longest2(s):
    t = re.split("[^\d+]",s)
    if t:
        return max(t,key = len)
    return -1
m = "123456789ss123dd456789"
print(longest1(m))
print(longest2(m))

3、将一句英语文本中的单词进行倒置,标点不倒置,假设单词之间使用一个或多个空格进行分割。比如I like beijing. 经过函数后变为:beijing. like I。
**注:**课件程序

import re
def reverse(s):
    t = re.split("\s+",s.strip())
    t.reverse()
    return ' '.join(t)
print(reverse('I like beijing.'))
print(reverse('Simple is better than complex.'))

4、编写程序,使用正则表达式提取另一个Python程序中的所有函数名
**注:**文件选择后续会学习到,着重理解表达式的写法,同样是用r写成原始字符串形式,def 开头,注意python程序函数定义def 后有个空格(\w+)贪心模式,匹配最长的字符串,其中"\w"表示匹配任何字母,数字,以及下划线

import re
fileName = input('请输入一个 Python 程序文件名:')
pattern = r'def (\w+)'                      
funcNames = []
with open(fileName, encoding='utf8') as fp:
    for line in fp:
        result = re.findall(pattern, line)
        if result:
            funcNames.extend(result)
print(funcNames)

5、假设有一句英文,其中某个单词中有个不在两端的字母误写作大写,编写程序使用正则表达式进行检查和纠正为小写。注意不要影响每个单词两端的字母。
注:"\b"表示字符串的边界,但却不统计边界分隔符,该表达是的意思是统计格式为两边字母相同,中间字符通过lambda表达式转化为小写。特别注意\b…\b统计的是独立的单词,如果内部是某个单词的一部分则不统计。

import re
def checkModify(s):
    return re.sub(r'\b(\w)(\w+)(\w)\b',lambda x:x.group(1)+x.group(2).lower()+x.group(3),s)
print(checkModify('aBc ABBC D eeee fFFFfF'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值