一、 正则表达式

 

 

元字符

\d

digit,数字(等效:[0-9])

\d+

匹配连续的数字

\D

非数字

\D{3}

匹配连续的非数字

\w

word,单词([A-Z0-9a-z_])

\w{6}

6个单词字符

\W

非单词(单词是指标识符)

\W{3}

3个非单词字符

\s

space,空白字符([\t\r\n])

\s{2}

2个空白字符

\S

非空白字符

\S{3}

3个非空白字符

通配

.

除开换行的任意字符

.{3}

3个任意字符(换行除外)

 

量词

?

有一个或没有(0、1)

\d?

最多匹配一个数字

*

任意个数(0、1、2、3….)

\d*

匹配任意个数的数字

+

至少一个(1、2、3、4…)

[a-z]+

匹配一个以上的字母

 

数量

{m}

m个(x==m个)

\d{3}

精确匹配3个数字

{m,n}

m到n个(m<=x<=n个)

\d{3,5}

匹配3到5个数字

{m,}

至少m个(x>=m个)

\d{3,}

匹配3个到以上的数字

集合中任意一个

[set]

set可以是单个字符,也可以是范围

[\da-f]

十六进制中单个字符

不在集合中任意一个

[^set]

通上,set前有一个^,表示在所有字符中取set集合的补集

[^3-6]

3到6之外的字符

简单分组

()

括号用于将规则包起来,成为一组,不可拆分的规则不用括号包起来

(\.\d+)

.和紧接着的数字

边界

\b

能组成标识符的字符和不能组成标识符的字符之间

\b\d+

匹配非\w字符紧接着多个数字

|

多组规则,任意一组满足

\d{3}|[a-z]{5}

匹配3个数字或5个字母

 

注意:匹配N个,只连续出现N次。

二、 Python中使用正则表达式
常用方法:
方法 返回值类型 作用
  re.match(pattern, string, flags=0)   正则匹配对象、None   从头匹配
  re.search(pattern, string, flags=0)   正则匹配对象、None   匹配
  re.compile(pattern, flags=0)   正则模式对象、None   编译正则
  re.findall(pattern, string, flags=0)   列表   查找所有匹配
  re.sub(pattern, repl, string, count=0, flags=0)   字符串   字符串替换
  re.split(pattern, string, maxsplit=0, flags=0)   列表   字符串分割
  re.finditer(pattern, string, flags=0)   可迭代对象   获取多次匹配
匹配模式(标志):
  re.I:Ignore Case,全称 re.IGNORECASE,忽略字母大小写。
补充:
正则匹配对象的方法中,groups()方法,可以得到匹配到的所有组,是元组类型。
  re.search()方法,只有匹配到一个以后,就不再继续查找了。
  re.compile()编译得到的结果是一个正则模式对象,可以调用查找、匹配等方法,但是不需要再传递模式(pattern)参数。
  re.findall()返回的数据与模式有关,如果模式中没有组,会返回所有找到的完整匹配,如果模式中有组,只会返回匹配到的组内容。无论是否匹配到了数据,都会返回一个列表。
  re.findall()返回值演示

import re

found1 = re.findall(r'\d{2}\D', 'addafd3434daf3434adf')
print(found1)
# ['34d', '34a']

found2 = re.findall(r'(\d{2})\D', 'addafd3434daf3434adf')
print(found2)
# ['34', '34']

found3 = re.findall(r'((\d){2})\D', 'addafd3434daf3434adf')
print(found3)
# [('34', '4'), ('34', '4')]

 

  re.finditer()返回一个可迭代对象,可迭代对象每一次迭代返回的的是一个正则匹配对象。不管能不能匹配到数据,都会返回一个可迭代对象。
  re.finditer()使用示例:
# 示例一

import re

pattern = r'((\d+)\.(\d{2}))\D'
data = 'piis3.1415,rmb have 2.50,one apple need 3.25 yuan'
it = re.finditer(pattern, data)
for i in re.finditer(pattern, data):
    print(i, i.groups())

# 示例二

import re

pattern = r'(\d{2})\.(\1)\2'
data = '12.34dsafafad22.22,ad23.2323fd33.33,44.45'
for i in re.finditer(pattern, data):
    print(i, '\t', i.groups())

 

其他示例代码:

re.sub(r'灌水|水军|扯淡', '***', '一大批水军在这里扯淡、整天灌水。')
re.sub(r'(\d+)[a-z]+', r'(\1)', 'he234He, Hh66aabbcc')

import re

data = 'pi is 3.1415, I have a DREAM, Learning Python'
repl = '-*-'
split_result = repl.join(re.split(r'[a-z]+', data))
sub_result = re.sub(r'[a-z]+', repl, data)
print(split_result)
print(sub_result)
print(split_result == sub_result)

 

 

posted on 2018-11-19 11:25  若无未来  阅读(245)  评论(0编辑  收藏  举报