互联网技术

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 的规则作用于文本

上一篇 下一篇

猜你喜欢

热点阅读