正则表达式的用法及实例

写在前面

代码基于的python版本:python3.6

一、^ $ * ? + {2} {2,} {2,5} |

1、基本解释

注意:下面匹配模式中x可使用任意字符代替。
^x:表示字符串需要以“x”开头。
x$:代表结尾字符必须是x。
*:代表前面的字符可以重复任意多次,也可以出现0次,即≥0次。
?x:表示对x进行非贪婪匹配,即遇到第一个x即进入匹配模式中。
x+:表示x至少出现一次,即≥1次。
注意:下面匹配模式中m,n需要是数字。
x{m}:表示x字符出现m次。
x{m,}:表示x字符出现m次或m次以上。
x{m, n}:表示x字符出现的次数是m~n次(包含m和n)。
|:或,|的两边的字符都满足要求。

2、示例

示例1:已知字符串:“naaaanaa123”,判断此字符串是否以“n”开头,中间可以跟多个任意字符,最后以“3”结尾。

import re

line = "naaaanaa123"
regex_str = "^n.*3$"  # 字符串以n开头,中间可以跟多个任意字符,最后以3结尾
if re.match(regex_str, line):
    print("yes")    # 输出结果为yes

示例2:已知字符串:“naaaanaa123”,提取出第一次出现的“n”和第二次出现的“n”之间的字符串。

import re

line = "naaaanaa123"   # 需求是将第一次和第二次出现的两个n中间的字符串提取出来
regex_str = ".*(n.*n)(.*)"  # 字符串匹配模式:最开始可以是多个任意字符,接着出现n,再接着可以是多个任意字符,接着是n,最后也是多个任意字符,提取的内容是括号中的内容
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #提取括号内结果的字符串,group(1)表示只取第1个括号内的内容,输出结果:naaaan
    print(match_obj.group(2))  # 提取括号内结果的字符串,group(1)表示只取第2个括号内的内容,输出结果:aa123

示例3:“?”的用法。已知字符串:“naaaannaa123”,若仍然使用regex_str = “.*(n.*n).*” 这种匹配模式,结果是“nn”(这是因为正则表达式的贪婪匹配,即从模式匹配字符串的最后开始匹配,首先匹配.*,即“aa123”,接着遇到“n”,中间不管是出现很多字符还是没有出现,又遇到了下一个字符“n”,因此符合(n.*n),因此括号内的匹配结果是“nn”)。因此需要使用“?”,如下面代码所示:

import re

line = "naaaannaa123"   # 需求是将第一次和第二次出现的两个n中间的字符串提取出来
regex_str = ".*?(n.*n).*"  # 字符串匹配模式:限定"?",说明开启非贪婪匹配模式,即从左边开始,遇到第一个n,即进入匹配模式,而不需要等到最后一个
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:naaaann

上述这种模式虽然把“naaaan”输出了,但是后面的“nn”也被输出,这并不是我们想要的,这是因为我们只设置了模式匹配中的第一个“n”是非贪婪模式,但是第二个n现在仍然是贪婪模式,因此也需要在在第二个“n”之前加上“?”将其设置为非贪婪模式。代码如下:

import re

line = "naaaannaa123"   # 需求是将第一次和第二次出现的两个n中间的字符串提取出来
regex_str = ".*?(n.*?n).*"  # 字符串匹配模式:在"n"的前面都限定"?",表示对两个"n"都开启非贪婪模式
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:naaaan

示例4:利用+,使用贪婪匹配,输出相应的结果。

import re

line = "naaaananaa123"   
regex_str = ".*(n.+n).*"  # 贪婪匹配,即从后往前开始匹配,第一次出现n,然后前面是至少一个任意字符,接着再是n
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:nan

示例5:{1}表示必须出现1次。

import re

line = "naaaananaa123"
regex_str = ".*(n.{1}n).*"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:nan

示例6:“|”的使用
第一个例子是完全字符匹配,不固定某一部分内容:

import re

line = "naana123"
regex_str = "(naana|naana123)"  # 匹配naana或者naana123,优先匹配前面的,即优先匹配naana,若line字符串中出现naana,则返回naana
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:naana

第2个例子是固定某一部分内容,只对其中一部分字符匹配:

import re

line = "naana123"
regex_str = "(nana|naana)123"  # 后面的数字固定,只针对前面的字符进行匹配
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:naana

示例7:括号的用法

import re

line = "naana123"
regex_str = "((nana|naana)123)"  # 后面的数字固定,只针对前面的字符进行匹配
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:naana123
    print(match_obj.group(2))  # 输出结果:naana

二、[] [^] [a-z] .

1、基本解释

注意:下面匹配模式中x可使用任意字符代替。
强调:进入[ ]中的字符就是字符本身,已经没有其他特殊的含义,比如,.和*只能表示.和*,不能再表示任意字符。
[xyz]:表示出现x、y、z都可以。
[^x] :中括号的取非操作,字符不能为x。
[a-z] :表示范围,即a-z的任一字符都可以。
.:只任意字符,包括所有的字符、制表符等所有。

2、示例

示例1:[ ]的第1个用途,表示可以是[ ]中的任一字符。

import re

line = "naana123"
regex_str = "([mnpq]aana123)" # 第一个字符是m、n、p和q中的任一字符都可以
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:naana123

示例2:[ ]的第2个用途:[^x]表示取非操作,即字符不能为x。

import re

line = "1563aa69842"
regex_str = "(1[45689][^1]{9})" #[0-9]{9}表示0-9之间任意一个字符都可以,出现9次
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:1563aa69842

示例3:[ ]的第3个用途,数据满足[ ]中的区间即可:

import re

line = "15635269842"
regex_str = "(1[45689][0-9]{9})" #[0-9]{9}表示0-9之间任意一个字符都可以,出现9次
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:15635269842

三、\s \S \w \W

1、基本解释

\s:表示空格。
\S:表示只要不是空格都可以。
\w:表示:A-Z、a-z、0-9和_之间的任意字符都可以。
\W:表示\w的取反操作,即不能为A-Z、a-z、0-9和_之间的任意字符。

2、示例

示例1:\s的作用

import re

line = "你 好"
regex_str = "(你\s好)" # 模式表示“你”和“好”之间需要有空格
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:你 好

示例2: \S的作用

import re

line = "你真好"
regex_str = "(你\S好)"   # 若是想匹配“你真的很好”,即“你”和“好”之间有多个字符,则需要使用“(你\S+好)”
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:你真好

示例3:\w的作用

import re

line = "你S_好"
regex_str = "(你\w+好)"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:你S_好

四、[\u4E00-\u9FA5] () \d

1、基本解释

[\u4E00-\u9FA5]:这是Unicode编码,表示任意汉字都可以。
\d:表示数字的意思。

2、示例

示例1:[\u4E00-\u9FA5]的作用

import re

line = "你*好"
regex_str = "([\u4E00-\u9FA5]+)"
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:你
import re

line = "study in 清华大学"
regex_str = ".*?([\u4E00-\u9FA5]+大学)"  # 若不加?,则是贪婪匹配,从后往前返回一个汉字,结果为“华大学”
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:清华大学

示例2:\d的使用

import re

line = "张三出生于1998年"
regex_str = ".*?(\d+)年"  # 加?取消贪婪模式,或者使用(\d{4})
match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1)) #输出结果:1998
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值