python与正则表达式

正则表达式是什么?可以理解为文本的一种抽象特征,通过特定的符号规则,来对应特定的文本。这里我们实践的是python中的正则表达式。

python中使用正则表达式很简单,包括下面4个简单步骤:

  • 引入正则表达式模块,import re;
  • 用re.compile()函数创建一个Regex对象;
  • 向Regex对象的search()方法传入想要查找的字符串,它返回一个match对象;
  • 调用match对象的group()方法,返回实际匹配的字符串。

实操代码如下:

import re

phoneNUmRegex = re.compile(r"\d\d\d-\d\d\d-\d\d\d\d")
mo = phoneNUmRegex.search("my number is 415-555-4242.")
print("phone number found:"+mo.group())

通过上面的代码,你可能明白了正则的难点在哪:compile中的规则定义。python中的正则有哪些可用的规则呢?

进阶

利用括号分组

一个简单的问题,当电话号码中有区号时,如何分离区号和电话号码?在正则表达式中添加括号即可。依旧是上面的代码,改动如下:

import re

phoneNUmRegex = re.compile(r"(\d\d\d)-(\d\d\d-\d\d\d\d)") # 添加括号
mo = phoneNUmRegex.search("my number is 415-555-4242.")
print("zone des found :"+mo.group(1))
print("phone number found:"+mo.group(2))
   

用管道匹配多个分组

人生面临太多选择,有些人坚定一个方向,一头扎进去;也有些人总是去试试这个,试试那个。当你在正则中想要多个选择时,如何匹配?管道可以帮你解决这个问题,我们来看如下代码:

import re

fruitRegex = re.compile(r"apple|banana") # 管道
f1= fruitRegex.search("apple and orange")
f2 = fruitRegex.search("banana and orange")

print("i like :"+f1.group())
print("i like :"+f2.group())
    

? or * or + or {}

学习正则时,最容易混淆的是这几个符号,现说明如下:

符号说明
可选匹配,零次或一次,即至多出现一次
*零次或多次
+一次或多次,即至少出现一次
{}特定次数

当然你可以用下面的代码实操一下:

import re

chooseRegex = re.compile(r"ba(na)+") 
f1= chooseRegex.search("banana")

print("i like "+f1.group())

贪心和非贪心匹配

Python的正则表达式默认是“贪心”的,表示在有二义的情况下,它们会尽可能匹配最长的字符串。下面看一段代码:

"""
import re

greedyHaRegex =re.compile(r"(Ha){3,5}")
mo1 = greedyHaRegex.search("HaHaHaHaHa")
print(mo1.group())

greedyHaRegex1 =re.compile(r"(Ha){3,5}?")
mo2 = greedyHaRegex1.search("HaHaHaHaHa")
print(mo2.group())

两段逻辑的输出如下:
out_put
r"(Ha){3,5}" 表示匹配3次或5次,python默认输出5次,当加了问号:r"(Ha){3,5}?",则输出3次。

问号在正则表达式中有两种含义:声明非贪心匹配或表示可选的分组,这两种含义完全无关。

findall() 方法

Regex对象除了search方法外,还有一个findall() 方法。findall() 方法的返回结果有两种情况:

  • 如果调用在一个没有分组的正则表达式上,该方法返回一个匹配字符串的列表;
  • 如果调用在一个有分组的正则表达式上,返回一个元组列表。

字符分类

列举常用的字符分类的缩写代码如下:

缩写字符分类表示
\d0-9的任何数
\D除0-9的数字以外的任何字符
\w任何字母、数字或下划线字符
\W除字母、数字和下划线的任何字符
\s空格、制表符或者换行符(可以认为匹配“空白”字符)
\S除空格、制表符和换行符以外的任何字符

用方括号定义自己的字符分类

缩写的字符分类太宽泛,你可能需要自己的字符分类,方括号能帮你解决这个问题。想一想如何匹配所有的元音字符?代码如下:

import re

vowelRegex =re.compile(r"[aeiouAEIOU]")
mo1 =vowelRegex.findall("i like banana")
print(mo1)
 

定位开始(^)和结尾($)

符号说明
^表明匹配必须发生在被查找文件开始处
$表明匹配必须在这个正则表达式的模式结束

你可以用下面的代码逻辑实操一下:

import re

begin_end_hello =re.compile("^Hello")
mo1 = begin_end_hello.search("Hello wordl")
print(mo1==None)

通配符(.)

通配符可以匹配除了换行符之外的所有字符,一种特殊的用法:用点-星匹配所有的字符(换行符除外)。那么问题来了,如果我想匹配所有的字符包括换行符,怎么办?这需要在compile方法中填入第二个参数。

compile方法的第二个参数

参数说明
re.DOTALL可以让句点字符匹配所有字符,包括换行符
re.I让正则表达式不区分大小写

当然,compile方法的第二个参数可选项远远不止这些,可以去API中查看。

替换字符串(sub)

生活中常有这样的应用场景,在word中全文替换某个单词,你是如何解决的呢?word中提供了批量替换的操作,正则表达式中也有相应的功能,例如:替换某个句子中的人名。实操代码如下:

import re

nameRegex=re.compile("Jerry\w?")
mo1 = nameRegex.sub("Tonny","Tom is a mouse and Jerry is a cat.But Tom can not catch Jerry,and is defeated by Jerry every day.")
print(mo1)

写在最后

这篇文章不是正则的全部,更丰富的功能还需要你自己去挖掘,后续或有更新…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值