普通字符:A-Z; a-z; 0-9; _等等
特殊字符:
. 匹配任意字符
^ 匹配字符串的开头
$ 匹配字符串尾 或者 匹配换行符前一个字符
\ 转义匹配*, +, ?
重复修饰——贪婪模式:
* 匹配0到任意次重复
+ 匹配1到任意次重复
? 匹配0到1次重复
{m} 匹配m次重复
{m,n} 匹配m到n次重复
重复修饰——非贪婪模式:
*?, +?, ??
(...) 捕捉组合:若使用捕捉分组,那么使用re.split()的时候,被匹配的文本也将出现在结果列表中
使用捕捉分组,那么使用re.match() re.search() re.findall()之后可以使用group()分别将每个组的内容提取出来
匹配之后,再用 \number 转义序列进行再次匹配
(?:...) 非捕捉组合
[] 匹配字符集合,任选其中一个字符进行匹配:
字符单独列出:[anq]匹配'a', 'n', 'q'
字符范围:[a-z]匹配小写字母, [0-9]匹配数字,-被转义或者在首位或末尾则表示-本身
特殊字符在集合中失去特殊功能[(+*)]
a | b 匹配a 或者 b
\1 对前面整体重复
rpWord = re.compile(r"\s*\b(\w+)\b.*\1") # 判断是否有重复单词
textSub = re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
# 反斜杠数字比如 \3 指向前面模式的捕获组号
\d 匹配十进制数
\D 匹配非数字
\s 匹配空格
\S 匹配非空格
\w 匹配任意字母数字[a-zA-Z0-9]
\W 匹配非\w
\A 匹配字符串开头
\Z 匹配字符串开头
\b 匹配单词边界: \b...\b界定一个单词
注意:
r 原生字符: 去除python中的特殊意义
模块方法:
prog = re.complie(pattern) # 保存正则对象
result = prog.match()
正则对象方法:
re_obj = re.search(pattern, string, flags=0) # 搜索整个字符串,找到匹配样式的第一个位置
re_obj = re.match(pattern, string, flags=0) # 检查字符串开头是否匹配成功,失败返回None
re_obj = re.split(pattern, string, maxsplit=0, flags=0) # 用pattern分割string
re_obj = re.findall(pattern, string, flags=0) # 获得匹配列表
re_obj = re.sub(pattern, repl, string, count=0, flags=0) # 将string中匹配成功的pattern替换成repl
标志位:
flags = re.IGNORECASE
匹配对象:
方法:
注意:使用前要判断对象是否为空(None) if match: ...
group() 返回一个或多个匹配的子组
groups() 返回匹配的元组
groupdict() 返回一个字典,key为子组的组名
start() end() 匹配到字串的开始索引和结束索引
属性:
re 返回实例的正则对象
# 匹配123.htm的字符串,域名前只有数字,不包含字母或下划线
re.compile(r"^((?![a-zA-Z_]).)+\.htm$"))
# 测试search和match
def test():
s = 'Hey, Brain! Hey, Chandler! What time do you have? It is 6 clock.'
searchObj = re.search(r'\bH\S*?\b', s)
if searchObj:
print('search result:', searchObj.group(), ' pos at:', searchObj.lastindex)
matchObj = re.match(r'\bH\S*?\b', s)
if matchObj:
print('match result: ', matchObj.group(), ' pos at:', matchObj.pos)
# 判断字符串中是否有重复
def judgeRepeat(words):
# 重复字符
rpChar = re.compile(r".*(.).*\1")
# 重复单词
rpWord = re.compile(r"\s*\b(\w+)\b.*\1")
ret = rpWord.search(words)
if ret is None:
print('No repeat...')
else:
print('Repeat...', ret.group(1))
# 判断变量名是否合法
def isValName(valName):
ret = re.match('[a-zA-Z_]+[\w]*', valName)
if ret:
print("value name: %s legal" % valName)
else:
print("value name: %s non-legal" % valName)
# 使用正则表达式sub替换字符串
# 将文本中的 05/01/2020 转换成 2020-05-01
def testSub():
text = 'Today is 05/01/2020, I have studied Python since 11/24/2019.'
# progMatch = re.compile(r'(\d+)/(\d+)/(\d+)')
# progReplace = re.compile(r'\3-\1-\2')
# 反斜杠数字比如 \3 指向前面模式的捕获组号
textSub = re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
print(textSub)