- ab 字符串ab
- x|y x或y
- \y 特殊字符y 比如 ^+{}$()[]|-?*
- [a-d] a、b、c、d中的某个字符
- [^a-d] 与上面相
- [^(123|abc)] 匹配除了a、b、c 或者1、2、3这几个字符以外的任意字符
- \d 一个数字字符
- \D 一个非数字字符
- \s 一个空白字符
- \S 一个非空白字符
- \w 一个字母数字字符
- \W 一个非字母数字字符
- x* 0个或多个x
- x+ 1个或多个x
- x? 0个或1个x
- x{2} 2个且仅2个x
- x{2,5} 2-5个x
(exp)
匹配exp,并捕获文本到自动命名的组里(?<name>exp)
匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)
匹配exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp)
匹配exp,前面的位置(?<=exp)
匹配exp,后面的位置(?!exp)
匹配后面跟的不是exp的位置(?<!exp)
匹配前面不是exp的位置
*?
重复任意次,但尽可能少重复+?
重复1次或更多次,但尽可能少重复??
重复0次或1次,但尽可能少重复{n,m}?
重复n到m次,但尽可能少重复{n,}?
重复n次以上,但尽可能少重复
- \A 仅匹配字符串开头 \Aabc 结果 abc
- \Z 仅匹配字符串末尾 abc\Z 结果 abc
(?P<name>)
分组,除了原有编号外指定一个额外的名字 (?P<word>abc){2}
结果 abcabc
# -*- coding:UTF-8 -*-
import re
def main():
# 显示有Lenore或者Nevermore行。
fh = open('raven.txt')
for line in fh:
if re.search('(Len|Neverm)ore', line):
print(line, end='')
fh.close()
# 把所有匹配到的文本显示出来。
fh = open('raven.txt')
for line in fh:
match = re.search('(Len|Neverm)ore', line)
if match:
print(match.group())
fh.close()
# 将行中所有Lenore或Nevermore 替换为###。
# 替换1
fh = open('raven.txt')
for line in fh:
print(re.sub('(Len|Neverm)ore', '###', line), end='')
fh.close()
# 替换2
fh = open('raven.txt')
for line in fh:
match = re.search('(Len|Neverm)ore', line)
if match:
print(line.replace(match.group(), '###'), end='')
fh.close()
# 预编译正则
fh = open('raven.txt')
pattern = re.compile('(Len|Neverm)ore', re.IGNORECASE) # 预编译
for line in fh:
if re.search(pattern, line):
print(line, end='') # 如果要替换可写成 print(pattern.sub('###', line), end='')
fh.close()
if __name__ == "__main__":
main()