正则表达式符号使用小总结:
1、[ ]:方括号。匹配需要的字符集合,如[1-3]或[123]都是匹配1、2或者3。
2、^:脱字符号。方括号中加入脱字符号,就是匹配未列出的所有其他字符,如[^a]匹配除a以外的所有其他字符。
3、\:反斜杠。和python字符串使用规则一样,可以匹配特殊字符本身,如\d表示匹配0到9的任意一个数字字符,而\\d则表示匹配\d本身。
4、*:星号。匹配前一个字符0到n次,如pytho*n可以匹配pythn、pytoon、pythooooon等。还有其它匹配重复字符的如?、+或{m,n},其中{n,m}可以灵活使用,它表示匹配n次到m次
(?<name>exp) 匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp)。
但是在Python中,为 (?P<name>exp)。 简单例子:
import re pattern = re.compile(r'(?P<here>[a-z]+) ([a-z]+)', re.I) m = pattern.match('Hello World word helo') print (m.group('here'))
输出结果为:
Hello
命名组是便于使用的,可以替代需要记住组的数字,可以进行扩展使用。
\b 的用法也可以很灵活,在给定的字符串中,找到以小写字母开头的单词和单词数量。
import re s="i Am a gOod boy baby!!" result=re.findall(r'\b[a-z][a-zA-Z]*\b',s) print(result) print("小写字母开头的单词个数:",len(result))
结果:
['i', 'a', 'gOod', 'boy', 'baby'] 小写字母开头的单词个数: 5
Python3 匹配 IP 地址实例
import re ip ='192.168.1.1' trueIp =re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])',ip) print(trueIp)
输出结果:
192.168.1.1
re.sub 匹配标点符号、换行。
import re s = "you're asking me out.that's so cute.what's your name again?" print(re.sub(r"([.!?])", r"\1\n", s))
you're asking me out. that's so cute. what's your name again?
Python re 模块的 sub 方法:re.sub()。
用法:
re.sub(pattern, repl, string, count=0, flags=0)
在这里会容易出现的问题是,错误的将 flags 参数传入 count,例:
>>> re.sub('123.*', '123*', '123ab\nc', re.S) '123*\nc'
是不是没有替换掉换行符后的字符?
正确的写法应该是当使用 re.sub() 的可选参数时,要传入所有可选参数。或者指定参数名,如下:
>>> re.sub('123.*', '123*', '123ab\nc', 0, re.S) '123*' >>> re.sub('123.*', '123*', '123ab\nc', flags = re.S) '123*'
2)re.Pattern.sub()
re.Pattern 对象是匹配模对象,由 re.compile() 生成。
re.Pattern.sub(repl, string, count=0)
接上例:
>>> regex = re.compile('123.*', re.S) >>> regex.sub('123*', '123ab\nc') '123*'
这里 re.Pattern.sub() 不接受 flags 参数,因为 flags 是由 re.compile() 指定。
假如文本有个单纯重复了 2 次,利用正则保留一个输出:
>>> import re >>> x='this is is ok ok' >>> y= re.sub(r'(\w+)\s\1',r'\1',x) >>> print(y) this is ok >>>
正则表达式符号使用小总结:
1、[ ]:方括号。匹配需要的字符集合,如[1-3]或[123]都是匹配1、2或者3。
2、^:脱字符号。方括号中加入脱字符号,就是匹配未列出的所有其他字符,如[^a]匹配除a以外的所有其他字符。
3、\:反斜杠。和python字符串使用规则一样,可以匹配特殊字符本身,如\d表示匹配0到9的任意一个数字字符,而\\d则表示匹配\d本身。
4、*:星号。匹配前一个字符0到n次,如pytho*n可以匹配pythn、pytoon、pythooooon等。还有其它匹配重复字符的如?、+或{m,n},其中{n,m}可以灵活使用,它表示匹配n次到m次
(?<name>exp) 匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp)。
但是在Python中,为 (?P<name>exp)。 简单例子:
import re pattern = re.compile(r'(?P<here>[a-z]+) ([a-z]+)', re.I) m = pattern.match('Hello World word helo') print (m.group('here'))
输出结果为:
Hello
命名组是便于使用的,可以替代需要记住组的数字,可以进行扩展使用。
\b 的用法也可以很灵活,在给定的字符串中,找到以小写字母开头的单词和单词数量。
import re s="i Am a gOod boy baby!!" result=re.findall(r'\b[a-z][a-zA-Z]*\b',s) print(result) print("小写字母开头的单词个数:",len(result))
结果:
['i', 'a', 'gOod', 'boy', 'baby'] 小写字母开头的单词个数: 5
Python3 匹配 IP 地址实例
import re ip ='192.168.1.1' trueIp =re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])',ip) print(trueIp)
输出结果:
192.168.1.1
re.sub 匹配标点符号、换行。
import re s = "you're asking me out.that's so cute.what's your name again?" print(re.sub(r"([.!?])", r"\1\n", s))
输出结果:
you're asking me out. that's so cute. what's your name again?
Python re 模块的 sub 方法:re.sub()。
用法:
re.sub(pattern, repl, string, count=0, flags=0)
在这里会容易出现的问题是,错误的将 flags 参数传入 count,例:
>>> re.sub('123.*', '123*', '123ab\nc', re.S) '123*\nc'
是不是没有替换掉换行符后的字符?
正确的写法应该是当使用 re.sub() 的可选参数时,要传入所有可选参数。或者指定参数名,如下:
>>> re.sub('123.*', '123*', '123ab\nc', 0, re.S) '123*' >>> re.sub('123.*', '123*', '123ab\nc', flags = re.S) '123*'
2)re.Pattern.sub()
re.Pattern 对象是匹配模对象,由 re.compile() 生成。
用法:
re.Pattern.sub(repl, string, count=0)
接上例:
>>> regex = re.compile('123.*', re.S) >>> regex.sub('123*', '123ab\nc') '123*'
这里 re.Pattern.sub() 不接受 flags 参数,因为 flags 是由 re.compile() 指定。
假如文本有个单纯重复了 2 次,利用正则保留一个输出:
>>> import re >>> x='this is is ok ok' >>> y= re.sub(r'(\w+)\s\1',r'\1',x) >>> print(y) this is ok >>>