电子科技学习正则表达式笔记(三)

Python的 re 模块:核心函数和方法

1. 使 compile()函数编译正则表达式

  导入 re 模块后,在compile()
中编译正则表达式,例如:pattern =
re.compile(‘正则表达式’,re.S),然后便可以采用pattern来进行匹配了。

  以compile
中尚得带模块属性,即re.S,re.I,re.L,re.M,re.X等。

2.郎才女貌对象和 group()和 groups()方法

  匹配对象来半点个重大的法:group()和
groups()。 调用 match()或者
search()返回的目标就是相当对象,group()要么返回整个匹配对象,要么因要求返回特定子组。

  groups()则光返回一个包含唯一要全体子组的元组。如果没有子组的求,那么当group()仍然返回整个匹配时,groups()
返回一个空元组。

3. 施用 match()方法匹配字符串

  match()
函数计算从字符串的开场部分对模式进行匹配。如果配合成功,就回去一个匹配对象;如果配合失败,就归
None,匹配对象的 group()方法能够用于展示大成功之配合。

 1 html = '<html><head>title</head><body>2333</body></html>'
 2 pattern = re.compile('<.*?head>(.*?)<.*?body>(.*?)<.*?>')
 3 
 4 m = re.match(pattern, html)
 5 
 6 print(m.group())
 7 print(m.group(1))
 8 print((m.group(2)))
 9 print(m.groups())
10 # 输出:
11 # <html><head>title</head><body>2333</body>
12 # title
13 # 2333
14 # ('title', '2333')

>>> re.match('foo', 'food on the table').group() 
'foo' 

4. 用到 search()在一个字符串中查找模式,(搜索)

  search()的劳作措施以及
match()完全一致,不同之处在于
search()会因此它的字符串参数
,在随意位置对加正则表达式模式寻找第一糟面世的配合情况。

  如果找到成功之匹配,就见面回到一个郎才女貌对象;否则,返回
None。

  search() 和 match()
不同之处在于,search() 会搜索字符串中间有些。

>>> m = re.match('foo', 'seafood')     # 匹配失败 
>>> m = re.search('foo', 'seafood')   # 使用 search() 代替 
>>> if m is not None: m.group() 
... 
'foo'     # 搜索成功,但是匹配失败,在seafood中搜索foo    

 5.重复、特殊字符以及分组

  用一个郎才女貌电子邮件地址的正则表达式做例子。(\w+@\w+\.com),这个正则表达式只会配合简单的地方。

  为了在域名前补加主机名称支持,例如
www.xxx.com,需要利用?,\w+@(\w+\.)?\w+\.com,让(\w+\.)可选。

>>> pattern = '\w+@(\w+\.)?\w+\.com' 
>>> re.match(pattern, 'nobody@xxx.com').group() 
'nobody@xxx.com' 
>>> re.match(pattern, 'nobody@www.xxx.com').group() 
'nobody@www.xxx.com' 

  进一步扩充该示例,允许擅自数量之中档子域名有。把?改吗
* 号。\w+@(\w+\.)*\w+\.com

>>> patt = '\w+@(\w+\.)*\w+\.com' 
>>> re.match(patt, 'nobody@www.xxx.yyy.zzz.com').group() 
'nobody@www.xxx.yyy.zzz.com' 

  使用圆括哀号来配合和保存子组,以便让继续处理。

>>> m = re.match('(\w\w\w)-(\d\d\d)', 'abc-123') 
>>> m.group()                       # 完整匹配 
'abc-123' 
>>> m.group(1)                      # 子组 1 
'abc' 
>>> m.group(2)                      # 子组 2 
'123' 
>>> m.groups()                      # 全部子组 
('abc', '123') 

  group()通常用于为寻常方式展示有的匹配有,但为能够用于获取
取各个匹配的子组。可以动用
groups()方法来博一个包含有匹配子字符串的元组。

6.运 sub()和 subn()搜索以及替换

  有零星单函数/方法用于落实搜索以及替换功能:sub()和
subn()。两者几乎同样,都是以某字符串中所有匹配正则表达式的组成部分进行某种形式之更迭。

  用来替换的局部电子科技常见是一个字符串,
但它呢可能是一个函数,该函数返回一个就此来替换的字符串。

  subn()和 sub()的不同点是subn()
还回到一个意味替换的总数,替换后底字符串和象征替换总数的数字一起作为一个有所两个要素的元组返回。

>>> re.sub('X', 'Mr. Smith', 'attn: X\n\nDear X,\n') 
'attn: Mr. Smith\012\012Dear Mr. Smith,\012' 
>>> 
>>> re.subn('X', 'Mr. Smith', 'attn: X\n\nDear X,\n') 
('attn: Mr. Smith\012\012Dear Mr. Smith,\012', 2) 
>>> 
>>> print(re.sub('X', 'Mr. Smith', 'attn: X\n\nDear X,\n'))
attn: Mr. Smith 

Dear Mr. Smith, 

>>> re.sub('[ae]', 'X', 'abcdef') 
'XbcdXf' 
>>> re.subn('[ae]', 'X', 'abcdef') 
('XbcdXf', 2) 

7.扩张符号

   通过采用 (?iLmsux)
系列选,用户可以直接在正则表达式里面指定一个要多单记号,而不是经过
compile()或者其它 re 模块函数。

  下面为部分使 re.I/IGNORECASE
的演示, 最后一个演示在 re.M/MULTILINE 实现多执行混合:

>>> re.findall(r'(?i)yes', 'yes? Yes. YES!!')  # (?i) 不区分大小写 
['yes', 'Yes', 'YES'] 
>>> re.findall(r'(?i)th\w+', 'The quickest way is through this tunnel.') ['The', 'through', 'this'] 
>>> re.findall(r'(?im)(^th[\w ]+)', """ 
... This line is the first, 
... another line, 
... that line, it's the best 
... """) 
['This line is the first', 'that line'] 

 

相关文章