Python:正则表达式:基础语法,re模块的match()、search()、findall()和sub()、split()

一、正则表达式基础语法(Regular Expression)

1、正则表达式的创建方式:对象new RegExp(“正则表达式”, “修饰符”) 或者 /正则表达式/修饰符

伪代码

import re
# 给regExp正则表达式、给string1要匹配的内容
pattern = re.compile(regExp, re.I)
match = pattern.match(string1)

2、分组()和分隔|

(1)| 用于分割可供选择的字符,要与 ( ) 搭配使用,存在优先匹配:从左到右(从繁到简)。注意与 [ ] 搭配,就是他本身 |,不代表分割。

如 [ab|cd],既可以匹配 ab 也可以匹配 cd。
选择项的尝试匹配次序是左——>右,因此,[a | ab]中当a匹配之后,就不匹配 ab 了,即使 ab 更优。所以书写顺序应该是从繁到简。

(2)() 分组,作用1:把一部分作为整体;作用2:定义子模式方便后面引用

作为整体,加上重复次数,如

regExp = "java(script)?"

可以匹配java和javascript
定义子模式,方便后面通过\加数字引用,例如

regExp = "['][a-z][']"
regExp = "(['])[a-z]\1"

效果相同

3、\转译^$.*+?=|!/:{}()[] 、字符类、重复次数、位置锚点、修饰符

(1)特殊字符,^$.*+?=|!/:{}()[] 需要\转译

\o \t \n \v \f \r
^$.*+?=|!/:{}()[] 需要\转译

(2)字符类,[\w\W\s\S\d\D]

符号意义
[...]方括号内的任意字符
[^...]不在方括号内的任意字符
[a-b]字符范围。匹配包含的任一字符集
[^a-b]反向范围字符。匹配不在指定范围内的任何字符
.任意字符
\w任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W任何不适ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s任何Unicode空白符
\S任何非Unicode空白符的字符,注意\w和\S不一样
\d任何ASCII数值,等价于[0-9]
\D任何ASCII数字之外的任何字符,等价于[^0-9]
[\b]退格直接量(特例)

(3)重复次数,?+*{n}{n,}{m,n}

符号意义
?0或1次
+1次或多次
*任意次
{n}n次
{n,}n次或n次以上
{m,n}最少m次,最多n次

正则是贪婪的,在全体满足匹配条件的情况下,尽可能贪婪。

(4)位置锚点,^$\b\B(?=p)(?!p)

符号意义
^匹配字符串的开头,在多行检测中,匹配一行的开头
$匹配字符串的结尾,在多行检测中,匹配一行的结尾
\\b匹配一个单词边界的位置
\\B匹配非单词边界的位置
(?=p)零宽正向先行断言(要求接下来的字符都与p匹配,但不能包含匹配p的那些字符)
(?!p)零宽负向先行断言(要求接下来的字符不与p匹配)

(5)修饰符,re.I、re.L、re.M、re.S、re.U、re.X

符号意义
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

二、re模块的match()、search()、findall()和sub()、split()

(1)match()

从开始位置开始匹配

pattern = re.compile("([a-z]+) ([a-z]+)", re.I)
string1 = "hello world I love you"
match = pattern.match(string1)
print(match)

结果,返回对象

<_sre.SRE_Match object; span=(0, 11), match='hello world'>

(2)search()

从任何一个开始匹配

pattern = re.compile("([a-z]+) ([a-z]+)", re.I)
string1 = "hello world I love you"
search = pattern.search(string1)
print(search)

结果,返回对象

<_sre.SRE_Match object; span=(0, 11), match='hello world'>

(3)findall()

从任何一个开始匹配所有满足情况的字符

pattern = re.compile("((\d*)(\d+)(\d+))")
list1 = pattern.findall("4324892fja 212 fdsa 43")
print(list1)

结果,返回对象

[('4324892', '43248', '9', '2'), ('212', '2', '1', '2'), ('43', '', '4', '3')]

(4)sub()

字符串替换

phone = "158-1115-5899 # 电话号码"
pattern = "\D"
sub = re.sub(pattern, "", phone)
print(sub)

结果,返回列表

15811155899

(5)split()

字符串转列表

split = re.split("[\s\n,]", "kdsajfk fdsa,iii,fdsa\n")
print(split[:-1])

结果,返回列表

['kdsajfk', 'fdsa', 'iii', 'fdsa']

版权声明:本文为weixin_43473435原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。