python 正则

match(pattern, string, flag)

import re

string = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) (.*)', string)
for i in range(4):
    print(matchObj.group(i))

输出:

Cats are smarter than dogs      #group(0)
Cats
smarter
than dogs
  • 一个小括号代表是一个group,索引从1开始。索引0表示match的结果。

  • 正则表达式patter之后的?表示非贪婪匹配。比较group(2)和group(3)可以看出来区别。2遇到可以停的地方就停了,3一直匹配到了最后。

    • import re
      
      string = "Cats are smarter than dogs"
      # matchObj = re.search( r' (.+?)', string)
      matchObj = re.match( r'(.*) are (.*?) (.*?)', string)
      for i in range(4):
          print(matchObj.group(i))
      
      • 这样的group(3)为空,因为*是匹配0个到多个字符,然后有了?之后,会让*匹配尽可能少的字符。与group(2)不同的原因是group(2)两边必须是空格,group(3)只要前面是空格就可以了。

search(pattern, string, flags=0)

search 和match相似,只是match要从从字符串头开始匹配,search可以任意位置。

import re

line = "Cats are smarter than dogs"
pattern = " are (.*)"
print(re.match(pattern,line))
print(re.search(pattern,line))

输出

None        #match的结果
<re.Match object; span=(4, 26), match=' are smarter than dogs'>

Match对象

search()和match() 如果成功匹配返回一个re.MatchObject对象,否则返回None。

import re

line = "Cats are smarter than dogs"
pattern = " are (.*)"
matchObj = re.search(pattern,line)
print(matchObj)

print(matchObj.re)
print(matchObj.string)


print(matchObj.span())
print(matchObj.start())
print(matchObj.end())

输出

<re.Match object; span=(4, 26), match=' are smarter than dogs'> #Match对象
re.compile(' are (.*)')     #Match对象的正则表达式对象
Cats are smarter than dogs  #Match对象进行匹配的字符串
(4, 26)     #成功匹配的index
4           #成功匹配的第一个字符的下标
26          #成功匹配的最后一个字符的下标

sub(pattern, repl, string,count=0, flags=0)

用repl替换掉string中匹配的位置。

repl可以是一个返回字符串的函数

count表示模式匹配后的最大替换次数,默认0表示全部替换。

import re

phone = "2004-959-559 # 这是一个国外电话号码"

# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print("电话号码是:" + num)

# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print("电话号码是:" + num)

输出:

电话号码是:2004-959-559 
电话号码是:2004959559
  • 其中第一个正则表示从#一直匹配到结束。
  • \D表示所有非数字的字符
  • sub函数的返回值是替换之后的字符串
import re

# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)

s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))

输出:

A46G8HFD1134
  • (?P<value>)是给这个pattern分组取一个名字
import re

# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group(1))
    return str(value * 2)


s = 'A23G4HFD567'
print(re.sub('(\d+)', double, s))   #输出 A46G8HFD1134

所以Match对象的group方法除了可以传入index以外,还可以传入分组名称。

re.compile(pattern[, flags])

为了提高pattern的复用性,可以将pattern字符串编译成一个re.RegexObject 对象。

Pattern对象有和re模块中相同的方法,但更灵活

  • Pattern.match(string [, startIndex, endIndex]):可以从指定位置开始。

  • flag:

    • re.I 忽略大小写

pattern.findall(string [, pos [, endpos]])

成功匹配就返回一个满足正则的字符串list,否则空list。

re.finditer(pattern, string, flags=0)

和pattern.findall()类似,但是返回的迭代器。

import re

it = re.finditer(r"\d+", "12a32bc43jf3")
for match in it:
    print(match.group())

输出:

12
32
43
3

迭代器的使用都可以通过for-in循环。

re.split(pattern, string [, maxsplit=0, flags=0])

pattern匹配到的字符串等价于分隔符

re特殊字符

模式 描述
. 匹配任何字符,除了换行符
* 匹配0个或多个
+ 匹配1个或多个
匹配0个或1个前面的正则模式,非贪婪方式
\w 匹配字母、数字、和下划线
\W 匹配所有非数字、非字母、非下划线的字符,和\w相反
\s 匹配任意空白字符,等价[ \t\n\r\f],(空白符,制表符,换行符,...)
\S 匹配任意非空字符,和\s相反
\d 匹配任意数字
\D 匹配任意非数字
\b 匹配单词的边界,也就是单词和空格之间的位置。例如‘er\b’可以匹配到never中的‘er’,不能匹配到'verb'中的'er'
\B 匹配单词非边界,也就是单词和空格之间的位置。和\b相反
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。