1.正则表达式
正则表达式就是用来检测字符串是否满足某种规则的工具。
2.正则语法
----------------------单个字符-----------------------------------
1) . 匹配任意字符:匹配一个字符串,只有一位字符并这个字符是任意字符
2) \w 匹配字母数字下划线(一位)
3) \s 匹配空白字符(空白指空格,制表符(\t)和回车(\n)等所有能产生空白的字符)
4) \d 匹配一个数字字符
5) \b 检测是否是单词边界(单词的开头,单词的结尾,单词和单词之间的标点空格等)
注意:正则中遇到\b,匹配的时候先不管它,匹配成功后再回头看\b位置是否是单词边界
6) ^ 检测字符串是否以给定的正则表达式开头(开头)
7) $ 检测字符串是否以给定的正则表达式结束。
8) \W 匹配一个非数字,字母,下划线的字符
9) \S 匹配非空白字符
10) \D 匹配一个非数字字符
11) \B 检测非单词边界
----------------------匹配次数-----------------------------------
1) [] 匹配中括号中出现的任意字符。注意:(一个中括号匹配一个字符)。
-在正则中的中括号中的应用:
[1-8]:代表1~8
[-18]或者[18-] 代表'1' ,'8','-'
2) [^] 匹配不在[]字符集中的任意一个字符
3) * 匹配0次或多次
4) + 匹配1次或多次
5) ? 匹配0次或者一次
6) {N} 匹配N次
7) {M,} 至少匹配M次
8) {,N} 最多匹配N次
9) {M,N} 匹配至少M次,最多N次。要求N > M
python
------------------------------分支和分组------------------------
1) | 分支(相当于逻辑运算中的or)
注意:正则中的分支有短路操作(前面的分支满足不会执行后面。前面是个整体.)
2) 分组:通过加()分组.
3).捕获:安装完整的正则表达式去匹配,只捕获()中的内容。只有在findall中有效
3.python对正则表达式的支持(re模块)
1.内置的模块:re
1.fullmatch(正则表达式,字符串):判断整个字符串是否符合正则表达式的规则。如果匹配成功返回匹配对象,否则返回None
2.compile(正则表达式):将正则表达式转换成正则表达式对象
3.mach(正则表达式,字符串):判断字符串的开头是否能和正则表达式匹配。(前面匹配到了,后面不管如何都。)如果匹配成功返回匹配对象,否则返回None
4.search(正则表达式,字符串):在字符串中去查找第一个满足正则表达式要求的子串。如果找到了就返回匹配对象,否则None(只要的满足的一个,找到了就停止。)
5.split(正则表达式,字符串):按满足正则表达式的子串去切割字符串。
6.sub(正则表达式,替换字符串,字符串):返回值是新的字符串
7.findall(正则表达式,字符串):就是完整版的search()(获取所有满足的)返回值是列表。
注意:分组中的捕获效果在这个有效
4.正则里面的转义
注意:正则表达式中的转义和字符串中的转义字符没有任何关系。
在正则表达式中,可以通过在有特殊意义的符号前加''来表示符号本身
\+ \. \* \? \\ \( \) \[ \] \^ \$ \|
1.'-'只有在中括号中的两个字符之间才有特殊意义。
2.如果特殊符号放在[]中作为字符集的内容,除了'-'在两个字符之间以外,其他的都不需要转义。
3.'\'不管在哪都需要转义
4.^放在[]最前面需要转义,不然表示非
str1 = r'a\+'
作业
1.IP匹配
re_str = r'(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}'
print(re.fullmatch(re_str,'19.23.22.235'))
'''
<_sre.SRE_Match object; span=(0, 12), match='19.23.22.235'>
'''
2.邮箱匹配
re_str = r'^[0-9a-zA-Z]{,26}@[a-z]{,10}\.[a-z]{,5}'
print(re.fullmatch(re_str,'123txf@qq.com'))
'''
<_sre.SRE_Match object; span=(0, 13), match='123txf@qq.com'>
'''
- 计算一个字符串中所有的数字的和
例如:字符串是:‘hello90abc 78sjh12.5’ 结果是90+78+12.5 = 180.5
def num_mach(str1):
re_str = r'[-+]?[1-9]+[.]\d+|[+-]?\d+'
result = re.findall(re_str,str1)
sum = 0
for num in result:
sum += float(num)
return sum
print(num_mach('hello90abc 78sjh12.5'))
180.5
- 验证输入的内容只能是汉字
re_str = r'[\u4E00-\u9FA5\\s]+'
print(re.fullmatch(re_str,'啥借口多好看教案'))
- 电话号码的验证
re_str = r'13[0-9]{8}|147\d{8}|15[0-9]\d{8}|18[1-9]\d{8}'
print(re.fullmatch(re_str,'18189898973'))
- 简单的身份证号的验证
re_str = r'^([1-9]\d{5}[12]\d{3}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])\d{3}[0-9xX])$'
print(re.fullmatch(re_str,'528283826374758379'))
二、不定项选择题
- 能够完全匹配字符串“(010)-62661617”和字符串“01062661617”的正则表达式包括( A BD )
A. “(?\d{3})?-?\d{8}”
B. “[0-9()-]+”
C. “[0-9(-)]\d”
D. “[(]?\d[)-]\d*”
re_str = r'\(?010\)?\-?62661617'
print(re.fullmatch(re_str,'(010)-62661617'))
-
能够完全匹配字符串“c:\rapidminer\lib\plugs”的正则表达式包括( BC )
A. “c:\rapidminer\lib\plugs”
B. “c:\rapidminer\lib\plugs”
C. “(?i)C:\RapidMiner\Lib\Plugs” ?i:将后面的内容的大写变成小写
D. “(?s)C:\RapidMiner\Lib\Plugs” ?s:单行匹配 -
能够完全匹配字符串“back”和“back-end”的正则表达式包括( ACD)
A. “\w{4}-\w{3}|\w{4}” match->back,back-end fullmatch-> back,back-end
B. “\w{4}|\w{4}-\w{3}” match-> back, back fullmatch-> back,back-end
C. “\S+-\S+|\S+”
D. “\w\b-\b\w|\w*” -
能够完全匹配字符串“go go”和“kitty kitty”,但不能完全匹配“go kitty”的正则表达式包括(AD )
:\1就是重复前面第一个()/组合里面的内容
:\2就是重复前面第二个()/组合里面的内容
A. “\b(\w+)\b\s+\1\b”
B. “\w{2,5}\s*\1”
C. “(\S+) \s+\1”
D. “(\S{2,5})\s{1,}\1” -
能够在字符串中匹配“aab”,而不能匹配“aaab”和“aaaab”的正则表达式包括( B,C)
A. “a*?b”
B. “a{,2}b”
C. “aa??b”
D. “aaa??b”
网友评论