python正则表达式

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),可以用来描述和匹配字符串的特定模式。

在 Python 中,使用 re 模块来处理正则表达式。

import re
# re.match() 从字符串的开始进行匹配,如果开始部分匹配成功就返回匹配对象,否则返回None
m = re.match('foo', 'food') # 返回匹配对象
print(m) # <_sre.SRE_Match object; span=(0, 3), match='foo'>

m = re.match('foo', 'fas')
print(m) # None

# re.search() 扫描字符串,如果找到匹配就返回匹配对象,否则返回None
m = re.search('foo','hellofood')
print(m)

m = re.search('foo','hello')
print(m)

# re.findall() 查找所有匹配,返回所有匹配结果的列表
m = re.findall('ab','abcdabcdabcd')
print(m)

# re.finditer() 查找所有匹配,返回所有匹配结果的一个iterator
m = re.finditer('ab', 'abcdabcdabcd')
print(m)
for i in m:
# print(i)
print(i.group())

# re.sub() 用于替换匹配的字符串。将匹配到的字符串替换为另一个字符串
text = 'yeah, but no, but yeah, but no'
print(re.sub('but','AND',text))

接下来将重点描述re.natch()的使用:

re.match(pattern, string)

其中,pattern是正则表达式,是我们匹配时的标准,string是待匹配字符串。re.match() 从字符串的开始进行匹配,如果开始部分匹配成功就返回匹配对象,否则返回None。

首先是单字符的匹配:

 

# .匹配任意一个字符 除了\n
ret = re.match('.','M')
print(ret.group())

ret = re.match('t.o', 'two')
print(ret.group())

ret = re.match('h', 'hellopython')
print(ret.group())

ret = re.match('H', 'Hellopython')
print(ret.group())

# 匹配[]中列举的字符
ret = re.match('[hH]', 'hellopython')
print(ret.group())

ret = re.match("[hH]ello Python","Hello Python")
print(ret.group())

ret = re.match("[0123456789]Hello Python","6Hello Python")
print(ret.group())

ret = re.match("[0-9]Hello Python","6Hello Python")
print(ret.group())

# [a-z], [0-9],[a-zA-Z],[0-35-9]0到3和5到9
ret = re.match("[0-35-9]Hello Python","6Hello Python")
print(ret.group())

# 5[3-9] 匹配 53 到 59。
# 6[0-1] 匹配 60 到 61。
pattern = r'^(5[3-9]|6[0-1])Hello Python'
text = "57Hello Python"
ret = re.match(pattern, text)
print(ret.group() if ret else "No match")

# \d 匹配数字,即0-9
ret = re.match("python\d","python2停止维护了")
print(ret.group())

ret = re.match("python\d","python3发布了")
print(ret.group())

# \D 匹配非数字,即不是数字
ret = re.match('\D','f')
print(ret.group())

# \s 匹配空白,即空格 tab键
ret = re.match("hello\sworld", "hello world")
print(ret.group())

# ret = re.match('hello\sword','hello\tworld')  # 这句话会报错 二者不匹配
ret = re.match("hello\sworld", "hello\tworld")
print(ret.group())
ret2 = re.match("hello\sworld", "hello\tworld")
if ret2:
    print("双引号匹配成功:", ret2.group())  # 输出: hello\tworld
else:
    print("双引号匹配失败")

# \S 匹配非空白
match_obj = re.match("hello\Sworld", "hello&world")
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

match_obj = re.match("hello\Sworld", "hello$world")
if match_obj:
  result = match_obj.group()
  print(result)
else:
    print("匹配失败")

# \w 匹配非特殊字符,即a-z A-Z 0-9 _ 汉字
match_obj = re.match("\w", "A")
if match_obj:
  # 获取匹配结果
  print(match_obj.group())
else:
  print("匹配失败")

# \W 匹配特殊字符 即非字母 非数字 非汉字
match_obj = re.match("\W", "&")
if match_obj:
  # 获取匹配结果
  print(match_obj.group())
else:
  print("匹配失败")

多字符的匹配:

# * 匹配前一个字符出现0次或者无限次
ret = re.match("[A-Z][a-z]*","M")
print(ret.group())

ret = re.match("[A-Z][a-z]*","MnnM")
print(ret.group())

ret = re.match("[A-Z][a-z]*","Aabcdef")
print(ret.group())

# + 匹配前一个字符出现1次或者无限次
match_obj = re.match("py.+n", "python")
if match_obj:
  print(match_obj.group())
else:
  print("匹配失败")

# ?匹配前一个字符出现1次或者0次 要么有1次要么没有
match_obj = re.match("https?", "http")
if match_obj:
  print(match_obj.group())
else:
  print("匹配失败")

# {m}匹配前一个字符出现m次
ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
print(ret.group())

# {m,n}匹配前一个字符出现从m到n次
ret = re.match("[a-zA-Z0-9_]{8,20}","1a2b3c4d5e6f7g8h9ijklmn")
print(ret.group())

info = "<div>1111</div><div>2222</div>"

# 贪婪模式
ret = re.match("<div>.*</div>", info)
print(ret.group())

# 非贪婪模式
ret = re.match("<div>.*?</div>", info)
print(ret.group())

匹配开头或结尾:

# 匹配开头结尾
# ^ 匹配字符串开头  \d 以数字开头复习: .代表任意 *代表多次
ret = re.match("^\d.*", "6hello")
print(ret.group())

# $匹配字符串结尾  \d以数字结尾
ret = re.match(".*\d$", "hello6")
print(ret.group())

ret = re.match("^\d.*\d$", "6hello6")
print(ret.group())

# [^指定字符] 表示除了指定字符都匹配
ret = re.match("[^aeiou]", 'ah')
print(ret.group() if ret else "匹配失败")

# 或的使用
ret = re.match("mysql|flask","python")
print(ret.group() if ret else "匹配失败")

# 分组的使用 (ab)    将括号中字符作为一个分组
# \w{4,10} 4-10个字符
ret = re.match("\w{4,10}@(163|126|qq|gmail)\.com","hello@qq.com")
# ret = re.match("\w{4,10}@(163|126|qq|gmail)\.com","llo@qq.com")
print(ret.group() if ret else "匹配失败")

ret = re.match(".+:1\d{4,10}", "电话:10086")
print(ret.group() if ret else "匹配失败")

还有分组,标识符等。

 

posted @ 2025-05-11 18:56  凉天  阅读(15)  评论(0)    收藏  举报