正则表达式
大约 4 分钟
import re
# 元字符
str1 = 'q1@A7_lT#v\t\v\r7f H9\nDj'
# 提取所有数字字符
res = re.findall('\d', str1)
print(res) # ['1', '7', '7', '9']
# 等同于
res = re.findall('\d+', str1)
print(res) # ['1', '7', '7', '9']
# 等同于
res = re.findall('[0-9]', str1)
print(res) # ['1', '7', '7', '9']
# 提取所有字母字符
res = re.findall('\D', str1)
print(res) # ['q', '@', 'A', '_', 'l', 'T', '#', 'v', '\t', '\x0b', '\r', 'f', ' ', 'H', '\n', 'D', 'j']
# 等同于
res = re.findall('[^0-9]', str1)
print(res) # ['q', '@', 'A', '_', 'l', 'T', '#', 'v', '\t', '\x0b', '\r', 'f', ' ', 'H', '\n', 'D', 'j']
# 匹配包括下划线的任何单词字符(但不匹配其他特殊符号),等效于 [A-Za-z0-9_]
res = re.findall('\w', str1)
print(res) # ['q', '1', 'A', '7', '_', 'l', 'T', 'v', '7', 'f', 'H', '9', 'D', 'j']
# 匹配任何非单词字符(包括空格" "和回车'\n'、换行'\r'、制表'\t')
res = re.findall('\W', str1)
print(res) # ['@', '#', '\t', '\x0b', '\r', ' ', '\n']
# 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]
res = re.findall('\s', str1)
print(res) # ['\t', '\x0b', '\r', ' ', '\n']
# 匹配除换行符外所有的字符
res = re.findall('.', str1)
print(res) # ['q', '1', '@', 'A', '7', '_', 'l', 'T', '#', 'v', '\t', '\x0b', '\r', '7', 'f', ' ', 'H', '9', 'D', 'j']
# 字符集
str2 = 'abc,ahc,afc,aic,alc,aqc,awc,aec,acc'
# 找到中间是或不是c或f的字符
# c|f 等同于 cf
res = re.findall('a[^c|f]c', str2)
print(res) # ['abc', 'ahc', 'aic', 'alc', 'aqc', 'awc', 'aec']
# 匹配中间是从c到f的字符
res = re.findall('a[c-f]c', str2)
print(res) # ['afc', 'aec', 'acc']
# 数量词(默认贪婪)
str3 = 'Eq1javaee@A7_pythonlT#v7goo&H9Dj'
res = re.findall('[a-z]{2,6}', str3)
print(res) # ['javaee', 'python', 'goo']
# 数量词(?非贪婪,仅取最小值2)
res = re.findall('[a-z]{2,6}?', str3)
print(res) # ['ja', 'va', 'ee', 'py', 'th', 'on', 'go']
str4 = 'Eq1javaee@A7_jav1lT#v7goo&H9Dj'
# 匹配0次、或者无限多次
res = re.findall('java*', str4)
print(res) # ['java', 'jav']
# 匹配1次、或者无限多次
res = re.findall('java+', str4)
print(res) # ['java']
# 匹配0次、或者1次
res = re.findall('java?', str4)
print(res) # ['java', 'jav']
# 边界匹配符:4~8位之间
str5 = '125000000043411'
res = re.findall('\d{4,8}', str5)
print(res) # ['12500000', '0043411']
# 加入 ^$ 可以匹配完整的字符串
res = re.findall('^\d{4,8}$', str5)
print(res) # []
# 无法匹配以0开头的字符串
res = re.findall('^000', str5)
print(res) # []
# 无法匹配以0结尾的字符串
res = re.findall('000$', str5)
print(res) # []
# 组(),表示完整地匹配()中的内容
# [] 中的字符表示`或`,()中的字符表示`与`
str6 = 'Eq1javaee@A7_java1lT#v7goo&java'
res = re.findall('(java)', str6)
print(res) # ['java', 'java', 'java']
# 匹配模式参数:re.I 表示忽略大小写
str7 = 'Eq1javaGo\n\r\n1lT#Python&groovy'
res = re.findall('go.{2}', str7, re.I) # []
print(res)
res = re.findall('go.{2}', str7, re.I | re.S) # ['Go\n\r']
print(res)
# 正则替换 re.sub
def replace(value):
return value.group(0).upper()
str8 = 'Eq1javaAviator1lT#Py3thon&3groovyaviator'
res = re.sub('aviator', 'Go', str8, 1, re.I)
print(res) # Eq1javaGo1lT#Py3thon&3groovyaviator
# 内置函数无法识别大小写
res = str8.replace('aviator', 'Go', 2)
print(res) # Eq1javaAviator1lT#Py3thon&3groovyGo
# 配合函数使用
res = re.sub('aviator', replace, str8, 1, re.I)
print(res) # Eq1javaAVIATOR1lT#Py3thon&3groovyaviator
# 替换字符串中的数字,如果是1则替换为a,如果是3则替换为z
def convert(value):
if value.group(0) == '1':
return 'a'
elif value.group(0) == '3':
return 'z'
res = re.sub('\d', convert, str8, 3, re.I)
print(res) # EqajavaAviatoralT#Pyzthon&3groovyaviator
# match 和 search 方法
str9 = 'Eq1javaAviator1lT#Py3thon&3groovyaviator'
str10 = '1javaAviator1lT#Py3thon&3groovyaviator'
# match 会从字符串的首字母开始匹配,如果没找到就返回 None,如果找到就立即返回匹配结果,不再继续寻找
result1 = re.match('\d', str9)
print(result1) # None
result1 = re.match('\d', str10)
print(result1.group()) # 1
print(result1.span()) # (0, 1)
# search 则会搜索整个字符串,直到找到一个满足的结果,如果找到就立即返回匹配结果,不再继续寻找
result2 = re.search('\d', str9)
print(result2.group()) # 1
# group
str11 = "And every fair from fair sometime declines, By nature's untrimm"
res = re.match('And .* untrimm', str11)
print(res.group()) # And every fair from fair sometime declines, By nature's untrimm
# 排除首位单词
res = re.match('And (.*) untrimm', str11)
# group(0) 表示完整的匹配结果,匹配到的内容在 group(1) 中,因为它分了两个组:一个组是完整的匹配结果,另一个组是匹配到的内容
print(res.group(1)) # every fair from fair sometime declines, By nature's
其实开发中常用的正则表达式网络上都已经有了,直接拿来用就可以了,不必重复造车轮子,例如,判断电话号码
、邮箱
、IP地址
、身份证号
等。
感谢支持
更多内容,请移步《超级个体》。