Python入门学习(七)高级部分:正则表达式

一、定义

正则表达式是一个特殊的字符序列,可以检测一个字符串是否与设定的字符序列相匹配。可以实现文本字符快速检索、替换等功能。

import re
a = "C|C++|Java|C#|Python|Javascript|Python"
#已有以下两种方式判断某字符串是否在指定文本中
print(a.index("Python") > -1)
print("Python" in a)

#以下为正则表达式最基本的方法findall,只是参数设为常数
r = re.findall("Python", a)
if len(r) != 0:
    print("字符串a中包含Python")
    print(r)
else:
    print("Not exit!")

二、元字符与普通字符

普通字符即是a-z,0-9,A-Z,标点符号这些所有的非元字符。

元字符是指特定指代某些特殊含义的字符。如/d匹配一个数字字符,等价于[0-9];/D匹配一个非数字字符,等价于[^0-9];\n匹配一个换行符;\s匹配任意的不可见字符,包括空格、制表符、换页符等;\S匹配任意的课件字符;[a-z]、[A-Z]匹配指定范围内的任意字符;\b匹配一个单词边界,即指单词和空格之间的位置,如“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的"er";\B匹配一个非单词边界.....等等。

import re
a = "C0C++7Java8C+9Python6Javascript"

#提取a中的数字,参数设为表示0~9的正则表达式
#\d即为元字符,表示数字
r = re.findall("\d", a)
print(r)

#提取a中的非数字
r1 = re.findall("\D", a)
print(r1)

 

三、字符集

出现在字符集中的字符之间是“或”的关系,即均可匹配,如[cf],既匹配c也匹配f。

#字符集

import re
s = "abc, acc, adc, aec, afc, ahc"

#找出中间一个字符是c或者f的字符串/单词
#通过普通字符a\c定界
#再通过字符集设定我们的需求
r1 = re.findall("a[cf]c", s)

#匹配中间字符非c非f非d的字符串/单词
r2 = re.findall("a[^cfd]c", s)

#匹配中间字符为一段字符中任一字符的字符串/单词
r3 = re.findall("a[c-f]c", s)

print(r1)
print(r2)
print(r3)

 

import re

s = "python@11 11\tjava&67\n8__php\rC++"

#匹配字符串中的所有数字
r1 = re.findall("\d", s)
#也可以如下明确的字符集方式
r2 = re.findall("[\d]", s)
#也可以如下:
r3 = re.findall("[0-9]", s)
r4 = re.findall("[^\D]", s)

print(r1)
print(r2)
print(r3)
print(r4)
#如要匹配字符串中所有数字和字母
#可以用\w,该元字符表示数字和字母和下划线,即只能匹配单词字符
r5 = re.findall("\w", s)
#也可以如下
r6 = re.findall("[0-9a-zA-Z_]", s)

print(r5)
print(r6)

#非单词字符则是用\W来匹配
r7 = re.findall("\W", s)
print(r7)
#空格、制表符、换行等称为空白字符,可用\s表示
r8 = re.findall("\s", s)
print(r8)

 四、数量词

#数量词
import re

a = "python 1111java678php"

r1 = re.findall("[a-zA-Z]", a)
#但这样只能匹配到单个字符
print(r1)
#如何按单词的方式去匹配呢
#可以在匹配组合后面加上数量,这就称为数量词
r2 = re.findall("[a-zA-Z]{3}", a)
print(r2)
#而且数量词可设为一个区间
r3 = re.findall("[a-zA-Z]{3,6}", a)
print(r3)

数量词的匹配模式:贪婪与不贪婪

贪婪即是指:如上代码对于[a-zA-Z]{3,6}这样的正则表达式,匹配字符串a时,因为设置的匹配数量是3到6,当匹配到"pyt"时已经满足正则表达式的要求了,这时候是输出呢还是继续匹配呢?

python中默认是继续匹配——即贪婪模式,直到匹配不到,或者已经超出设置的数量范围才输出。贪婪即要匹配更多...

如要设置为非贪婪模式,则在数量词后面加?即可:

import re

a = "python 1111java678php"

#默认为贪婪匹配模式
r3 = re.findall("[a-zA-Z]{3,6}", a)
print(r3)

#非贪婪模式
r4 = re.findall("[a-zA-Z]{3,6}?", a)
print(r4)

其实非贪婪模式下的{3,6}?与{3}作用类似。

除了上述的方式,数量词还有用*表示匹配*前面的字符0次或者无限多次;+匹配+前面的字符1次或者无限多次;?匹配?前面的字符0次或者1次。

#数量词
import re

a = "pytho0python1pythonn2"
b = "pyth111pythoner333pythonnnn555"

#*匹配0次或无限多次
#具体就是对*前面一个字符"n"可以出现0次或者无限次
r1 = re.findall("python*", a)
r2 = re.findall("python*", b)
print(r1)
print(r2)

#+是匹配1次或无限多次
r3 = re.findall("python+", a)
print(r3)

#?是匹配0次或者1次
#此时也涉及当即可以匹配0次又可以匹配1次的时候,默认是匹配1次
r4 = re.findall("python?", a)
print(r4)

#组合用法
r5 = re.findall("python{1,2}", a)
print(r5)

五、边界匹配、组、匹配模式参数

#边界匹配
import re
QQ_number = "100000001"
#验证是否为QQ号码,默认QQ号码为4~8位
#^表示从字符串第一个字符开始匹配
#$表示从字符串最后一个或几个字符也得匹配
r = re.findall("^\d{4,8}$", QQ_number)
print(r)
if r !=[]:
    print("是QQ号码!")
else:
    print("不是QQ号码!")
#
import re
a = "PythonPythonPythonPythonPython"

#要求判断a中是否包含3个python
#需要成组的字符用()组合
#要注意[]里的字符是或的关系,()里的字符是且的关系,即组合。
r1 = re.findall("(Python){3}", a)
print(r1)
#匹配模式参数
import re

language = "PythonC#\nJavaPHP"
#第三个参数即为模式参数
#设为re.I为忽略字母大小写
r = re.findall("c#", language, re.I)
print(r)
#设为re.S 为设置"."匹配所有字符(含换行符)
r1 = re.findall("C#.{1}", language, re.S)
print(r1)
#也可以组合使用,|是且的关系
r2 = re.findall("c#.{1}", language, re.I | re.S)
print(r2)

 

posted @ 2025-07-28 20:38  tsembrace  阅读(238)  评论(0)    收藏  举报