初识正则

正则表达式可以判断目标字符串是否符合特定的要求。
正则表达式大致的匹配过程是,首先拿出表达式和文本中的内容进行比较,如果每一个字符都能匹配,则匹配成功,一旦有匹配不成功的字符,则匹配失败。

预定义字符集(可以写在字符集[..]中):
\d 表示任意的一位数字     digit
    \d\d 表示任意的两位数字
\D 表示非数字 [^\d]
 \w 表示任意的字母和数字       word
 \s 表示空格           space
     \S 表示非空白字符 [^\s]

数量词:用在字符或者(..)之后
.  : 表示任意的内容,1,2,3,a,b,c !@$
    不单独使用,经常跟在字符串后面
    a.  在a后面匹配任意的内容, ab,a1,a2,a4

*  :表示内容出现0次或者多次
    a.* 表示 a ab aaaaa  abbbbb

+  : 表示内容出现1次到多次
    a.+  aa ab ac ad av

?  :表示内容出现0次或者1次
    a.?  a  a1   a2
    g?  '' 'g'

^ : 表示以....开头
$ : 表示以....结尾

{n} : 表示内容重复n次
·\d\d\d   \d{3}

{n,m} : 最少重复n次,最多重复m次
\d{3,5}

{n,} 表示最少重复n次

{,m} 表示最多重复m次

1. match

 match 的用法:match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match就会返回None

 pattern = re.compile('(\d+)(\w+)')
 content = '123hellowrold'
 result = re.match(pattern, content)
 print(result.group(0))
 # 123hellowrold
 # group(0) 是输出所有的。
 # group(1) 是输出第一个括号里面的。

 pattern = re.compile('my')
 result = re.match(pattern, 'myself')
 print(result.group(0))
 # my
 # 在group里写不写0都是输出my,
 # 但是写 1 就会报错

 # match 匹配的是内容开始的部分,跟字符串里面的startswith很像
 pattern = re.compile('my')
 result = re.match(pattern, 'love myself')
 print(result)
 # 输出: None

2 贪婪匹配与非贪婪匹配


 正则表达式默认是贪婪匹配:尽量找到所有符合的要求
     .* 称之为贪婪模式

 content = 'cdcdccddddcc121'
 pattern = re.compile('(c.*d)')
 result = re.match(pattern, content)
 print(result.group())
 # 输出:cdcdccdddd

     .*? 称之为非贪婪模式
# content = 'cdcdccddddcc121'
 # 从c开始往后找,找到第一d就结束
 pattern = re.compile('(c.*?d)')  # 这里加不加括号,下面都要写group
 result = re.match(pattern, content)
 print(result.group())
 # 输出: cd

 # .*(b.*?b) 这个表示的是:匹配任意字符开头,后面找一个以b开头以b结尾的内容

 print('hello \n \world')
 # raw string 会将字符串里面的转义字符输出出来
 print(r'hello \n world')

 # 匹配全国固话 0371-66668888
 pattern = re.compile(r'(\d{4}-\d{8})')
 result = pattern.match('0371-88886666')
 print(result.group())
 # 输出:0371-88886666

 # | 表示或者,设置用于不同情况的正则
 pattern = re.compile(r'((haha|heihie)|balabala)')
 result = re.match(pattern, 'hahabalabala')
 print(result.group())
 # 输出 haha

3 search 与 findall

 # search 找到字符串当中第一个符合正则的内容 
 # 注意,只找第一个。
 pattern = re.compile(r'you')
 result = re.search(pattern, 'I love you I hate you')
 print(result.group())
 # 输出:you
#
 # 这个写的比上面的能稍微简单一点
 pattern = re.compile(r'you')
 result = pattern.search('I miss you I lilke you')
 print(result.group())


 # findall 找出所有符合的内容
 content = '12345,上山打老虎,老虎没打着,打只小松鼠,55555'
 pattern = re.compile(r'(\d{5})')
 result = pattern.findall(content)
 print(result)
 # ['12345', '55555']

4 sub 的简单认识

假如输入的字符串是’hello 111 world 111’,
可以通过str.replace(‘111’, ‘222’) 来实现
但是 如果字符串是’hello 123 world 456’,就不能用replace来实现
这时就需要re.sub了



# sub 替换子串
 content = '杨    过对战金轮法王,郭靖观战'
 pattern = re.compile(r'(杨\s*过)')
 # 这里的第一个参数表示替换后的,第二个参数表示要替换的字符串
 result = pattern.sub('吕布', content)
 print(result)
 # 输出:吕布对战金轮法王,郭靖观战

 pattern = re.compile(r'金轮法王')
 result = pattern.sub('服部半藏', result)
 print(result)
 # 输出:吕布对战金轮法王,郭靖观战


content = '杨    过对战金轮法王,郭靖观战'
key_word = [
    (r'杨\s*过', '吕布'),
    (r'金轮法王', '服部半藏'),
    (r'郭靖', '东方不败')
]
for pattern, replace in key_word:
    #print(pattern)
    # 杨\s*过
    #金轮法王
    #郭靖
    pattern = re.compile(pattern)  # 这句话表示的要替换的子串
    content = pattern.sub(replace, content)
print(content)
# 吕布对战服部半藏,东方不败观战
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值