python正则表达式二

标点符号的特殊含义

特殊字符Value
.(点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符。
^(插入符号) 匹配字符串的开头, 并且在 MULTILINE 模式也匹配换行后的首个符号。
$匹配字符串尾或者在字符串尾的换行符的前一个字符,在 MULTILINE 模式下也会匹配换行符之前的文本。
*对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。
+对它前面的正则式匹配1到任意次重复。
?对它前面的正则式匹配0到1次重复。
*?, +?, ??‘*’, ‘+’,和 ‘?’ 修饰符都是 贪婪的;它们在字符串进行尽可能多的匹配。
{m}对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。
{m,n}对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。
{m,n}?前一个修饰符的非贪婪模式,只匹配尽量少的字符次数。
|转义特殊字符
[]用于表示一个字符集合。
|A|B,一旦 A 匹配成功, B 就不再进行匹配
(…)(组合),匹配括号内的任意正则表达式,并标识出组合的开始和结尾。
(?…)这是个扩展标记法 (一个 ‘?’ 跟随 ‘(’ 并无含义)。 ‘?’ 后面的第一个字符决定了这个构建采用什么样的语法。
(?aiLmsux)( ‘a’, ‘i’, ‘L’, ‘m’, ‘s’, ‘u’, ‘x’ 中的一个或多个) 这个组合匹配一个空字符串;
(?:…)正则括号的非捕获版本。 匹配在括号内的任何正则表达式,但该分组所匹配的子字符串 不能 在执行匹配后被获取或是之后在模式中被引用。
(?aiLmsux-imsx:…)(‘a’, ‘i’, ‘L’, ‘m’, ‘s’, ‘u’, ‘x’ 中的0或者多个, 之后可选跟随 ‘-’ 在后面跟随 ‘i’ , ‘m’ , ‘s’ , ‘x’ 中的一到多个 .) 这些字符为表达式的其中一部分 设置 或者 去除 相应标记
(?P…)(命名组合)
(?P=name)反向引用一个命名组合;它匹配前面那个叫 name 的命名组中匹配到的串同样的字串。
(?#…)注释;里面的内容会被忽略。
(?=…)匹配 … 的内容,但是并不消费样式的内容。比如, Isaac (?=Asimov) 匹配 'Isaac ’ 只有在后面是 ‘Asimov’ 的时候。
(?!…)匹配 … 不符合的情况。
(?<=…)匹配字符串的当前位置,它的前面匹配 … 的内容到当前位置。
(?<!…)匹配当前位置之前不是 … 的样式。
(?(id/name)yes-pattern|no-pattern)如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern,no-pattern 可选,也可以被忽略。
种类[ ]的用法
1字符可以单独列出,比如 [amk] 匹配 ‘a’, ‘m’, 或者 ‘k’
2可以表示字符范围,通过用 ‘-’ 将两个字符连起来。比如 [a-z] 将匹配任何小写ASCII字符, [0-5][0-9] 将匹配从 00 到 59 的两位数字, [0-9A-Fa-f] 将匹配任何十六进制数位。 如果 - 进行了转义 (比如 [a-z])或者它的位置在首位或者末尾(如 [-a] 或 [a-]),它就只表示普通字符 ‘-’。
3特殊字符在集合中,失去它的特殊含义。比如 [(+*)] 只会匹配这几个文法字符 ‘(’, ‘+’, ‘*’, or ‘)’。
4字符类如 \w 或者 \S (如下定义) 在集合内可以接受,它们可以匹配的字符由 ASCII 或者 LOCALE 模式决定。
5不在集合范围内的字符可以通过 取反 来进行匹配。如果集合首字符是 ‘^’ ,所有 不 在集合内的字符将会被匹配,比如 [^5] 将匹配所有字符,除了 ‘5’, [^^] 将匹配所有字符,除了 ‘^’. ^ 如果不在集合首位,就没有特殊含义。
6在集合内要匹配一个字符 ‘]’,有两种方法,要么就在它之前加上反斜杠,要么就把它放到集合首位。比如, [()[]{}] 和 [{}] 都可以匹配括号。

练习

  1. 用户名匹配:由数字、字母、下划线和中横线-组成,长度为4到14位,并且不能以数字开头。
import re

while True:
    user_name = input('请输入用户名')
    x = re.compile(r'^[a-zA-Z_-][\w-]{3,13}$')
    if x.match(user_name):
        print('成功输入用户名{}'.format(user_name))
        break
    else:
        print('用户名不合法,请重输')

在这里插入图片描述

  1. 匹配邮箱
    r'^[\w.-]+@[\w.-]\.[a-zA-z]{2,4}$'
  2. 匹配手机号
    r'^1\d{10}$'

正则替换

a = 'ad234ds3dsf2'
print(re.sub(r'\d+', '0', a))  # 把数字替换成0


# 通过函数替换,把数字变成2倍
def Doub(x):
    data = x.group()
    return str(int(data) * 2)


print(re.sub(r'\d+', Doub, a))

# 或者用lambda表达式
print(re.sub(r'\d+', lambda x: str(int(x.group()) * 2), a))

贪婪模式

a = 'ad234acv234dsf2345'
result = re.match(r'ad(.+)(\d+)', a)
print(result.group(1))
result1 = re.match(r'ad(.+)(.+)', a)
print(result1.group(1))
result2 = re.match(r'ad(\d+)(.+)', a)
print(result2.group(1))

在这里插入图片描述
python正则表达式默认贪婪模式(尽可能多的匹配)

非贪婪模式

a = 'ad234acv234dsf2345'
result = re.match(r'ad(.+?)(\d+)', a)
print(result.group(1))
result1 = re.match(r'ad(.{2,5}?)(.+)', a)
print(result1.group(1))
result2 = re.match(r'ad(\d+?)(.+)', a)
print(result2.group(1))

在这里插入图片描述

作业

  1. 用户名匹配,要求:
    • 用户名只能包含数字 字母 下划线
    • 不能以数字开头
    • 长度在6到16位范围
import re


def user_name():
    while True:
        name = input('请输入用户名')
        if re.match(r'^[a-zA-z_]\w{5,15}$', name):
            print('输入正确')
            break
        else:
            print('输入不合法')


user_name()

在这里插入图片描述

  1. 密码匹配,要求:
    • 不能包含!@#¥%^&*这些特殊符号
    • 必须以字母开头
    • 长度在6到12位
import re


def pass_word():
    while True:
        p_word = input('请输入密码')
        if re.fullmatch(r'[a-zA-z][^!@#¥%^&*]{5,11}', p_word):
            print('输入正确')
            break
        else:
            print('输入不合法')


pass_word()

在这里插入图片描述

  1. 已知有文件test.txt里面的内容如下:
陈XX Caoyan 6895 13811661805 caoyan@baidu.com
常XX Yu Cao 8366 13911404565 caoyu@baidu.com
柴XX Shirley Cao 6519 13683604090 caoyue@baidu.com
曹XX Cao Zheng 8290 13718160690 caozheng@baidu.com
查XX Zha Lingli 6259 13552551952 zhalingli@baidu.com
查XX Zha Shan 8580 13811691291 zhanshan@baidu.com
查XX Rachel 8825 13341012971 zhanyu@baidu.com

提取文件中所有的手机号和邮箱

import re

file_name = r'H:\pythonProject\test'

# 定义手机号提取规则
get_tel = re.compile(r'\d{11}')
# 定义邮箱提取规则
get_mail = re.compile(r'\w+@baidu\.com')


# 读取文件
with open(file_name, encoding='utf-8') as f:
    list1 = f.readlines()
    str_l = ' '.join(list1)

print('所有电话号码是{}'.format(get_tel.findall(str_l)))
print('所有邮箱是{}'.format(get_mail.findall(str_l)))

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yerennuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值