Python的正则表达式匹配
2019-12-24 本文已影响0人
LiuShaodong
正则表达式(regular expression),是定义了一个有规则的表达式,编程语言能够根据这条规则,帮助小伙伴们从字符串中寻找所有的符合规则的部分,根据正则表达式的定义规则,我们可以将规则写的很具体,比如 3
,那么 Python 会帮我们去匹配给定的字符串是否包含 3
,也可以复杂一点,例如,\d
表示数字,Python 会帮我们把字符串中的数字都匹配出来,那么,我们一起来学习一下 Python 中正则匹配的语法吧:
匹配一句话内是否包括某个字段
pattern1 = "cat"
pattern2 = "bird"
string = "dog runs to cat"
print(pattern1 in string) # True
print(pattern2 in string) # False
用正则包 re
来操作上面同样的需求
pattern1 = "cat"
pattern2 = "bird"
string = "dog runs to cat"
print(re.search(pattern1,string))
print(re.search(pattern2,string))
[ ] 和 - 的相关用法
pattern = r"r[au]n" # 可以匹配到 run 和 ran (其中,r"",r 在字符串前,代表是正则表达式,不是普通的字符串)
print(re.search(pattern,string))
print(re.search(r"r[A-Z]n","dog runs to cat"))
print(re.search(r"r[a-z]n","dog runs to cat"))
print(re.search(r"r[0-9]n,dog r0ns to cat"))
print(re.search(r"r[0-9a-z]n","dog runs to cat"))
\d 匹配所有的数字,\D 匹配所有的非数字
\s 匹配所有的空白,包括空格,制表符,回车等造成的空白
\S 匹配所有的非空白字符
\w 匹配 a-zA-Z0-9,即所有的数字,字母和 "_"
\W 匹配所有非数字,字母和 "_"
\b 匹配单个空格
print(re.search(r"\bruns\b","dog runs to cat") # 可以匹配到
print(re.search(r"\bruns\b","dog runs to cat") # 匹配不到
print(re.search(r"\b runs \b","dog runs to cat") # 匹配不到
\B 忽略空格匹配
print(re.search(r"\Bruns\B","dog runs to cat") # 匹配到
print(re.search(r"\Bruns\B","dog runs to cat") # 匹配到
print(re.search(r"\B runs \B","dog runs to cat") # 匹配到
匹配 \,前面需要再加一个 \
print(re.search(r"runs\\","runs\ to me")) # 匹配到
print(re.search(r"r.n","r-ns to me")) # 匹配到,"."可以匹配一个字符
匹配句首句尾
print(re.search(r"^dog","dog runs to cat")) # 匹配到
print(re.search(r"cat$","dog runs to cat")) # 匹配到
? 匹配(内容)可以省略括号中内容
print(re.search(r"Mon(day)?","Monday")) # 匹配到
print(re.search(r"Mon(day)?","Mon")) # 匹配到
Multi 多行匹配
string_mul = """
dog runs to cat.
I run to dog.
"""
print(re.search(r"^I",string)) # 匹配不到,把整个字符串看成一个句子,句首是 dog
print(re.search(r"^I",string,flags=re.M)) # 匹配到,整个字符串看成是多个句子,每个句子的句首都匹配一下
0次或者多次出现 用 *
,1次或者多次出现 用 +
print(re.search(r"ab*","a")) # 匹配到,b可以出现0次或者多次
print(re.search(r"ab*","abbbbbbbb")) # 匹配到,b可以出现0次或者多次
print(re.search(r"ab+","a")) # 匹配不到,b可以出现1次或者多次
print(re.search(r"ab+","abbbbbbbb")) # 匹配到,b可以出现1次或者多次
{ } 出现次数的范围,b{1,10}指的是b可以出现1次到10次之间
print(re.search(r"ab{2,10}","ab")) #匹配不到
print(re.search(r"ab{2,10}","abbbbb")) #匹配到
group 组匹配
match = re.search(r"ID: (\d+), Date: (.+)","ID: 021523, Date: Feb/12/2017")
print(match.group()) # 输出匹配到的所有的信息
print(match.group(1)) # 输出第一个() 匹配到的信息
print(match.group(2)) # 输出第二个() 匹配到的信息
如果 () 特别多,会导致 1,2,……这样很麻烦,应该起一个名字:?P<名字>
match = re.search(r"ID: (?P<id>\d+), Date: (?P<data>.+)","ID: 021523, Date: Feb/12/2017")
print(match.group("id"))
print(match.group("date"))
findall 寻找所有的匹配,区别于 search 是找到一个就可以
print(re.findall(r"r[ua]n","run ran ren")) # run ran
替换
print(re.sub(r"r[au]ns","catches","dog runs to cat")) # dog catches to cat
分裂
print(re.split(r"[,;\.]","a;b,c.d;e")) # a b c d e 如果碰到任何一个 r"[分隔符]" 就把后面的内容分割。"." 代表任何字符,所以我们需要加 "\.",将其转义为一个点
complie 编译形式
compiled_re = [re.compile(r"r](http://re.compile%28r/)[ua]n")
print(compiled_re.search("dog run to cat")) #跟上述的操作基本一致,不同就是,先把规则进行 compile,然后用 compile 的规则作用于文本