re 所定义的 flag 包括:
re.I (re.IGNORECASE) 忽略大小写
re.L (LOCALE)(MULTILINE) 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M (MULTILINE) 多行模式
re.S (DOTALL) 即为’ . ’并且包括换行符在内的任意字符(’ . ’不包括换行符)
re.U (UNICODE) 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X (VERBOSE) 为了增加可读性,忽略空格和’ # ’后面的注释
以下两个正则表达式是等价的:
regex_1 = re.compile(r"""\d + # 数字部分
\. # 小数点部分
\d * # 小数的数字部分""", re.X)
regex_2 = re.compile(r"\d+\.\d*")
正则表达式验证工具:https://regex101.com/
系统学习:https://www.regular-expressions.info/
参考资料:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonre/index.html
re.match方法
import re
m = re.match(r'(\w+)(\w+)(?P<sign>.*)','hello world!')
# 字符串
print(m.string)
# 正则
print(m.re)
# 匹配的起始位置
print(m.pos)
# 匹配的终止位置
print(m.endpos)
# 最后一个分组的序号
print(m.lastindex)
# 最有一个分组的别名
print(m.lastgroup)
# 分组,1,2,和‘sign’
print(m.group(1,2,'sign'))
# 分组1,2,3
print(m.group(1,2,3))
# 元组: 所有分组
print(m.groups())
# 字典:有别名的分组
print(m.groupdict())
# 分组2的起始位置
print(m.start(2))
# 分组2的终止位置
print(m.end(2))
# 分组2的跨度
print(m.span(2))
# 调整分组的位置,将匹配到的分组代入template中然后返回。
# template中可以使用\id或\g、\g引用分组,但不能使用编号0。\id与\g是等价的;
# 但\10将被认为是第10个分组,如果你想表达\1之后是字符'0',只能使用\g<1>0。
print(m.expand(r'\2 \1\3'))
利用pattern对象进行字符串的匹配
import re
p = re.compile(r'(\w+)(\w+)(?P<sign>.*)',re.DOTALL) # 即为’ . ’并且包括换行符在内的任意字符
print(p.pattern)
print(p.flags)
print(p.groups)
print(p.groupindex)
# 利用match()方法进行字符串的匹配
import re
pattern = re.compile(r'How.*')
match = pattern.match('How are you?')
if match:
print(match.group())
# 利用search()方法进行字符串的匹配
import re
pattern = re.compile(r'H.*s')
match = pattern.search('lalalaHello,James')
if match:
print(match.group())
# 正则表达式分割字符串
import re
p = re.compile(r'\d+')
print(p.split('asdasd1asdasd2asdsad3'))
# 正则表达式找到所有匹配项且返回为列表或者迭代器
import re
p = re.compile(r'\d+')
print(p.findall('one1two2three3four4'))
for m in p.finditer('one1two2three3four4'):
print(m.group())
# 正则表达式进行替换
import re
p = re.compile(r'(\w+)(\w+)')
s = 'hello, my name is James. What\'s your name?'
# 使用repl替换string中每一个匹配的子串后返回替换后的字符串
print(p.sub(r'\2 \1',s))
# 当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
# count用于指定最多替换次数,不指定时全部替换。
def func(m):
# title() 首字母大写
return m.group(1).title() + ' ' + m.group(2).title()
print(p.sub(func,s))
# 返回字符串和替换的次数
print(p.subn(r'\2 \1',s))
总结:
- pattern可以用来匹配元素
- pattern可以用来匹配子元素
- pattern可以用来分割字符串
- pattern可以用来得到所有匹配项
- pattern可以用来字符串替换