当前位置:   article > 正文

【Python】正则表达式

【Python】正则表达式

1. 正则表达式模式

1.1 字符

模式描述
a, b, c, 1, 2, 3, -一个普通字符
\d一个数字字符
\D一个非数字字符
\s一个空白字符
\S一个非空白字符
[ab12]a, b, 1, 2中的一个字符
[a-e]a~e范围内的一个字符
[^a-e]不在a~e范围内的一个字符
.一个非换行符字符

1.2 字符的重复次数

模式描述
*0次或多次
+1次或多次
?0次或1次
{2}2次
{2,5}2~5次
{2,}至少2次
{,5}至多5次

1.3 组合

模式描述
\d{3,4}[a-e]+多个小模式组合成大模式
|
()分组

1.4 位置

模式描述
^字符串起始位置
$字符串结束位置
\b单词边界
\B非单词边界
(?=...)

正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。

这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。

预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!...)

正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串

这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?<=...)

反向肯定预查,与正向肯定预查类拟,只是方向相反。

例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

(?<!...)

反向否定预查,与正向否定预查类拟,只是方向相反。

例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。

2. re模块

2.1 re.search和re.match

  1. re.search(pattern, string, flags=0)
  2. # 扫描整个string查找正则表达式pattern产生匹配的第一个位置,返回Match对象
  3. # 匹配失败返回None
  4. re.match(pattern, string, flags=0)
  5. # 和re.search一样,但必须从字符串的开始位置匹配
  6. # 即便是MULTILINE多行模式,re.match()也只匹配字符串的开始位置,而不匹配每行开始
  7. # flags:
  8. # re.IGNORECASE或re.I 使匹配对大小写不敏感
  9. # re.MULTILINE或re.M 多行匹配,影响^和$,使它们匹配字符串的每一行的开头和结尾
  10. # flags可以用|进行组合

Match.group和Match.groups

  1. Match.group(num=0)
  2. # 返回一个或者多个匹配的子组
  3. m = re.match(r"(\S+) (\S+)", "I love coding.")
  4. m.group(0) # 整个匹配的字符串
  5. 'I love'
  6. m.group(1) # 第一个匹配的子组
  7. 'I'
  8. m.group(2) # 第二个匹配的子组
  9. 'love'
  10. m.group(1, 2) # 一个元组,包含第一个和第二个匹配的子组
  11. ('I', 'love')
  1. Match.groups()
  2. # 返回一个元组,包含所有匹配的子组
  3. m = re.match(r"(\d+)\.(\d+)", "3.1415")
  4. m.groups()
  5. ('3', '1415')

2.2 re.findall和re.finditer

  1. re.findall(pattern, string, flags=0)
  2. # 返回pattern在string中的所有非重叠匹配,以字符串列表或字符串元组列表的形式
  3. # 如果没有组,返回与整个模式匹配的字符串列表
  4. # 如果有且仅有一个组,返回与该组匹配的字符串列表
  5. # 如果有多个组,返回与这些组匹配的字符串元组列表
  6. re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
  7. ['foot', 'fell', 'fastest']
  8. re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
  9. [('width', '20'), ('height', '10')]
  1. re.finditer(pattern, string, flags=0)
  2. # 和re.findall一样,但是返回Match对象的迭代器

2.3 re.sub和re.subn

  1. re.sub(pattern, repl, string, count=0, flags=0)
  2. # 用repl替换pattern匹配的字符串,返回替换完成的字符串
  3. # count 模式匹配后替换的最大次数,默认0表示替换所有的匹配
  4. phone = "2004-959-559 # 这是一个电话号码"
  5. # 删除注释
  6. num = re.sub(r'#.*$', "", phone)
  7. print ("电话号码 : ", num)
  8. # 电话号码 : 2004-959-559
  9. # 移除非数字的内容
  10. num = re.sub(r'\D', "", phone)
  11. print ("电话号码 : ", num)
  12. # 电话号码 : 2004959559
  1. re.subn(pattern, repl, string, count=0, flags=0)
  2. # 和re.sub一样,但是返回一个元组 (字符串, 替换次数)

2.4 re.split

  1. re.split(pattern, string, maxsplit=0, flags=0)
  2. # 用pattern分割string,返回分割完成的字符串列表
  3. # maxsplit 分割次数,默认为0,不限制次数
  4. re.split(r'\W+', 'Words, words, words.')
  5. ['Words', 'words', 'words', '']
  6. re.split(r'(\W+)', 'Words, words, words.')
  7. ['Words', ', ', 'words', ', ', 'words', '.', '']
  8. re.split(r'\W+', 'Words, words, words.', 1)
  9. ['Words', 'words, words.']
  10. re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
  11. ['0', '3', '9']

2.5 re.compile

  1. re.compile(pattern, flags=0)
  2. # 将正则表达式的样式编译为一个正则表达式对象,供match和search这两个函数使用
  3. '''
  4. prog = re.compile(pattern)
  5. result = prog.match(string)
  6. 等价于
  7. result = re.match(pattern, string)
  8. '''
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号