就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
. ^ $ * + ? { } [ ] | ( ) \
从前面的描述可以看到'*','+'和'*'都是贪婪的,但这也许并不是我们说要的,所以,可以在后面加个问号,将策略改为非贪婪,只匹配尽量少的RE。示例,
1 print(re.findall(r"a(\d+?)","a23b")) # 非贪婪模式 2 >>>['2'] 3 print( re.findall(r"a(\d+)","a23b")) 4 >>> ['23']\:反斜杠后边跟元字符去除特殊功能,反斜杠后边跟普通字符实现特殊功能。引用序号对应的字组所匹配的字符串
1 #search查找匹配字符的起始位置与终止位置 2 n=re.search(r"(alex)(eric)com\2","alexericcomeric") 3 print(n.span()) 4 >>>(0, 15)\d 匹配任何十进制数;它相当于类 [0-9]。\D 匹配任何非数字字符;它相当于类 [^0-9]。\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]\b: 匹配一个单词边界,也就是指单词和空格间的位置。 匹配单词边界(包括开始和结束),这里的“单词”,是指连续的字母、数字和 下划线组成的字符串。注意,\b的定义是\w和\W的交界, 这是个零宽界定符(zero-width assertions)只用以匹配单词的词首和词尾。 单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标 示的。
1 print( re.findall(r"abc\b","dzx &abc sdsadasabcasdsadasdabcasdsa")) 2 >>>['abc'] 3 print( re.findall(r"\babc\b","dzx &abc sdsadasabcasdsadasdabcasdsa")) 4 >>>['abc'] 5 print( re.findall(r"\babc\b","dzx sabc sdsadasabcasdsadasdabcasdsa")) 6 >>>[]
注意:re.match('com', 'comwww.runcomoob')re.search('\dcom', 'www.4comrunoob.5com')一旦匹配成功,就是一个match object 对象,而match object 对象拥有以下方法:group() 返回被 RE 匹配的字符串start() 返回匹配开始的位置end() 返回匹配结束的位置span() 返回一个元组包含匹配 (开始,结束) 的位置group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
1. group()返回re整体匹配的字符串,2. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常3.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到 所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
1 import re 2 a = "123abc456" 3 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体 4 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) 5 >>>[123] 6 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) 7 >>>[abc] 8 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) 9 >>>[456]group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
#re.findall 以列表形式返回所有匹配的字符串 #re.findall可以获取字符串中所有匹配的字符串。如: p = re.compile(r'\d+') print(p.findall('one1two2three3four4')) >>>['1', '2', '3', '4'] #获取字符串中,包含'oo'的所有非字符单词 text = 'djks#dooljsdJ(' print(re.findall(r'\w*oo\w*', text)) >>>['dooljsdJ'] #以数字分割字符串 p = re.compile(r'\d+') print(p.split('one1two2three3four4')) >>>['one', 'two', 'three', 'four', ''] #等同于 print(re.split('\d+','one1two2three3four4')) >>>['one', 'two', 'three', 'four', ''] 1 a = 'abc123abv23456' 2 b = re.findall(r'23(a)?',a) 3 print(b) 4 >>>['a', ''] 5 #匹配23后面为任意一个字符 6 b = re.findall(r'23(?:a)?',a) 7 print(b) 8 >>>['23a', '23']
转载于:https://www.cnblogs.com/liguangxu/p/5582404.html
相关资源:Python实现正则表达式匹配任意的邮箱方法