DAY17 regularExpression正则表达式 2018-07-03

01-recognize regular expression认识正则表达式

02-main functions 主要的函数


总结:

  1. 尽量使用泛匹配、非贪婪匹配,使用括号得到匹配目标,要匹配换行就用re.S模式
    30天入门正则表达式
    )
    在线工具-正则表达式测试

符号 解释 示例 说明
. 匹配除换行符(\n)任意字符 b.t 可以匹配bat / but / b#t / b1t等
\w 匹配字母/数字/下划线 b\wt 可以匹配bat / b1t / b_t等
但不能匹配b#t
\s 匹配空白字符(包括\r、\n、\t等) love\syou 可以匹配love you
\d 匹配数字 \d\d 可以匹配01 / 23 / 99等
\b 匹配单词的边界 \bThe\b 只匹配一个位置,该位置不能是字母、数字、或下划线
^ 匹配字符串的开始 ^The 可以匹配The开头的字符串
$ 匹配字符串的结束 .exe$ 可以匹配.exe结尾的字符串
\W 匹配非字母/数字/下划线 b\Wt 可以匹配b#t / b@t等
但不能匹配but / b1t / b_t等
\S 匹配非空白字符 love\Syou 可以匹配love#you等
但不能匹配love you
\D 匹配非数字 \d\D 可以匹配9a / 3# / 0F等
\B 匹配非单词边界 \Bio\B
[] 匹配来自字符集的任意一个单一字符 [aeiou] 可以匹配任一元音字母字符
[^] 匹配不在字符集中的任意单一字符 [^aeiou] 可以匹配任一非元音字母字符
* 匹配0次或多次 \w*
+ 匹配1次或多次 \w+
? 匹配0次或1次 \w?
{N} 匹配N次 \w{3}
{M,} 匹配至少M次 \w{3,}
{M,N} 匹配至少M次至多N次 \w{3,6}
| 分支 foo|bar 可以匹配foo或者bar
(?#) 注释
(exp) 匹配exp并捕获到自动命名的组中
(?exp) 匹配exp并捕获到名为name的组中
(?:exp) 匹配exp但是不捕获匹配的文本
(?=exp) 匹配exp前面的位置 \b\w+(?=ing) 可以匹配I'm dancing中的danc
(?<=exp) 匹配exp后面的位置 (?<=\bdanc)\w+\b 可以匹配I love dancing and reading中的第一个ing
(?!exp) 匹配后面不是exp的位置
(? 匹配前面不是exp的位置
*? 重复任意次,但尽可能少重复 a.*b
a.*?b
将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串
+? 重复1次或多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{M,N}? 重复M到N次,但尽可能少重复
{M,}? 重复M次以上,但尽可能少重复
\ 防止转义 1\.5 只匹配1.51a5125中的1.5

01-recognize regular expression认识正则表达式

正则表达式主要用于字符串查找/匹配/分割

import re

match(正则表达式字符串,需要匹配的字符串)

判断一个字符串是否是标识符(字母/数字/下划线组成,数字不开头)
[a-z]:是字母'a'到'z'中的任意一个;[A-Z];[0-9]:0到9中的任意个
str_ = r'[a-zA-Z]\w*$'
print('>>>',re.match(str_, 'ssf235sf'))

1.16.|-->分支(相当于逻辑运算符中的'or')

str_ = r'(a|b)abc' # -->匹配第一个字符是a或者b,后面是abc
print(re.match(str_, 'babc'))

print(re.match(r'(\d{3})|([a-z]{3})', '118a'))

总结?:就是在重复匹配多次的匹配中如果后面加?,就是尽可能以最少的次数的去匹配

2.main functions 主要的函数

import re

2.1 compile 将正则表达式字符编译成正则对象(就可以去调用相关的正则表达式对象方法)

exp = re.compile(r'\d\d[a-zA-Z]{2}')
print(type(result))    
print(result.match('13sg'))

<_sre.SRE_Match object; span=(0, 4), match='13_s'>

2.2.match()

a. re.match(正则表达式字符串/对象,要匹配的字符串)

b. 正则表达式对象.match(要匹配的字符串)

从字符串的起始位置开始匹配
成功就返回匹配对象,否则返回None
实例:
result = re.match(r'(\w+) (\w+)(.*)', 'hello world!')
print(result)
获取匹配结果在原字符串中的范围
print(result.span())
获取匹配开始的位置和结束的位置
print(result.start(), result.end())
获取匹配的结果
print(result.group(1,2))
print(result.groups())
获取原字符串
print(result.string)
结果:
<_sre.SRE_Match object; span=(0, 12), match='hello world!'>
(0, 12)
0 12
('hello', 'world')
('hello', 'world', '!')
hello world!

2.3. search()

a. re.search(正则表达式/对象, 指定的字符串)

b. 正则对象.search(指定的字符串)

在指定的字符串中, 去查找第一个指定正则表达式匹配的字符串,如果有就返回匹配对象,如果没有就返回None

str = r'a\dc'
result = re.search(r'a\dc', 'aiga4cgtwea3c sa')
print(result)       # value : <_sre.SRE_Match object; span=(3, 6), match='a4c'>

2.4. findall()

a. re.findall(正则表达式对象, 指定的字符串)

b. 正则对象.findall(指定的字符串)

获取指定字符串中,所有满足正则表达式的子串,返回一个列表
result = re.findall(r'a\dc', 'ioa2caggea4casd')
print(result)
结果:
['a2c', 'a4c']

2.5.split()

正则对象.split(指定字符串)

re.split(正则对象表达式,指定的字符串)

str2 = '窗前明月光,疑是地上霜.举头望明月,低头思故乡'
result = re.split(r'[,.]', str2, 2)
print(result)
结果:
['窗前明月光', '疑是地上霜', '举头望明月,低头思故乡']

2.6. sub()

re.sub(正则表达式, 替换字符串, 原字符串) -->替换后原字符串不变,返回一个新的字符串

将指定字符串中指定的子串替换成其他的字符串

str1 = 'abcdsd sgeyghaddsfbdhvvbbbb'
result = re.sub(r'[ab]', '*', str1)
print(result,'\n',str1)
结果:
cdsd sgeyghddsfdhvv****
abcdsd sgeyghaddsfbdhvvbbbb

补充:正则表达式中中文的判断
判断是否有中文,如果有就打印'不合格'
中文的Unicode编码范围:\u4e00-\u9fa5(正则表达式中Unicode前面需要加\u)

result = re.search(r'[\u4e00-\u9fa5]', 'asgeq大几十个d')

你可能感兴趣的:(DAY17 regularExpression正则表达式 2018-07-03)