正则表达式,regular expression, 缩写为regex regexp re等
分类:BRE ERE PCRE python使用SRE
基本语法:
元字符metacharactor
. 匹配任意(除换行符)
[xx] 占一位,匹配括号里任一字符
[^x] 占一位,不匹配括号里任一字符
[a-z] 匹配任一位小写字母
\b 匹配单词边界
\B 不匹配单词的边界
\d ==[0-9]
\D 匹配一位非数字
\s ==[\f\r\n\t\v]匹配一位空白字符
\S 匹配一位非空白字符
\w 匹配[a-zA-Z0-9_],包括中文的字
\W 匹配\w之外的字符
\ 转义符号,例如 \\ \. \r \n \[ \]
重复
* 前面的正则表达式 重复0或多次
+ 前面的正则表达式 重复1或多次
?前面的正则表达式 重复0或1次
{n} 前面的正则表达式 重复n次
{n,} 前面的正则表达式 至少重复n次
{n,m} 前面的正则表达式 至少重复n到m次
或匹配
x|y 匹配x或y 长的在前 短的在后
分组 捕获
(pattern) 自动分组从1开始
\数字 匹配分组 如 (very)\1 捕获 very very
(?:pattern) 不分组 只改表优先级
(?<name>pattern) 或 (?’name’ exp) 命名分组
断言
(?=exp) 断言后面跟着exp
(?<=exp) 断言前面跟着exp
(?!exp) 断言后面不是exp
(?<!exp) 断言前面不是exp
注释
(?#comment) f(?=oo)(?#这个后断言不捕获)
贪婪和非贪婪
*? 匹配任意次 尽可能少重复
+? 匹配至少1次 尽可能少重复
?? 匹配0或1次 尽可能少重复
{n,}? 匹配至少n次 尽可能少重复
{n,m}? 匹配至少n次 至多m次 尽可能少重复
引擎选项
re.I 忽略大小写
re.M 多行模式 ^行首 $行尾
re.S 单行模式,匹配所有字符包括\n
re.X 忽略表达式中的空白字符,如果要用可以转义
#Python正则表达式 re模块
import re
#re.match(pattern, string, flag=0) 只从头开始
print(re.match(‘www’, ‘awww.runoob.com’))
print(re.match(‘www’, ‘www.runoob.com’).span())
#group(num) groups() 获取小组,返回元组 group(‘name’)取分组
line = “Mei is a nice girl”
matchObj = re.match(r'(.*) is a (?P<ll>\w+) .*’, line, re.M|re.I)
if matchObj:
print(matchObj.group())
print(matchObj.group(1))
print(matchObj.group(‘ll’))
else:
print(“No match!”)
#re.search(pattern, string, flag=0) 扫描整个字符串返回第一个匹配的
print(re.search(‘www’, ‘www.runoob.com’))
print(re.search(‘com’, ‘www.runoob.com’).span())
#re.sub(pattern, repl, string, count=0, flag=0) 替换
# 参数:
# pattern : 正则中的模式字符串。
# repl : 替换的字符串,也可为一个函数。
# string : 要被查找替换的原始字符串。
# count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
phone = “2004-959-559 # 这是国外电话”
#删除字符串中的注释
print(re.sub(r’#.*$’, ”, phone))
#删除非数字字符串
print(re.sub(r’\D’,”,phone))
#repl参数是一个函数
def double(matched):
value = int(matched.group(‘value’))
return str(value * 2)
s = ‘A12D5JHK78’
print(re.sub(‘(?P<value>\d+)’, double, s))
#re.compile 编译正则表达式,给match()和search()使用
# re.compile(pattern[, flags])
pattern = re.compile(r’\d+’)
m = pattern.match(‘one12two’,3)
print(m)
print(m.group())
print(m.start())
print(m.end())
print(m.span())
#findall 匹配所有子串 返回列表
# findall(string[, pos[, endpos]])
pattern = re.compile(r’\d+’)
result1 = pattern.findall(‘gan is 23 tag 45’)
result2 = pattern.findall(‘gan is 23 tag 45’, 0, 10)
print(result1)
print(result2)
#re.finditer 与findall类似,匹配所有子串,返回迭代器
#re.finditer(pattern, string, flag=0)
it = re.finditer(r”\d+”, “12a32bc43jf3″)
print(it)
for match in it:
print(match.group())
#re.split 按照匹配的子串将字符串分割返回列表
#re.split(pattern, string[, maxsplit=0, flags=0])
s = ‘ nike is, a. like/ ‘
print(re.split(‘\W+’, s))
#练习题
#匹配邮箱
emails = ‘test@hot-mail.com is his working-email’
pattern = re.compile(‘\w+[-\.\w]+@[\w-]+(\.[\w-]+)+’)
print(pattern.findall(emails))
#匹配html标记内的内容
alink = ‘<a href=”http://www.baidu.com”>百度</a>’
print(re.findall(‘<[^<>]+>(.*)<[^<>]+>’, alink))
#匹配url
print(re.findall(”’href=[‘”](?P<alink>.*)[‘”]”’, alink))
#匹配二代中国身份证 17位数字+一位检验码
idlist = [
‘321105700101003’,
‘321105197001010030’,
‘11210020170101054X’
]
for id in idlist:
print(re.findall(‘\d{17}[xX\d]|\d{15}’,id)[0])
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/97431