20190105 qzd
-
python中所有正则表达式都在re模块中。--> import re
-
正则表达式匹配步骤
a. 用 import re 导入正则表达式模块
b. 用 re.compile() 函数创建一个 Regex 对象(记得使用原始字符串)
c. 向 Regrx 对象的 search() 方法传入想查找的字符串。它返回一个Match 对象。
d. 调用 Match 对象的 group() 方法,返回实际匹配文本的字符串。
举个例子:
num = re.complile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo=num.search("My number is 415-555-4242.")
print('phone num found: ' + mo.group())
result --> phone num found: 415-555-4242
-
用正则表达式匹配更多模式
a. 利用括号分组。想要一次就获取所有的分组,使用 groups() 方法。
b. 用管道( | )匹配多个分组。利用 findall() 方法可以找到“所有”匹配的地方。
c. 用 ?匹配可选匹配
d. 用 * 匹配零次或多次
e. 用 + 匹配一次或多次
f. 用 {} 匹配特定次数 -
贪心和非贪心匹配
贪心(默认)
非贪心(后加 ?)
poython 的正则表达式默认式“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的“非贪心”版本匹配尽可能最短的字符,即在结束花括号后跟着一个问号。
注: 问号在正则表达式中可能有两种含义, 声明非贪心匹配或表示可选的分组。 -
findall() 方法
a. 如果调用在一个没有没有分组的正则表达式上,例如\d\d\d-\d\d\d-\d\d\d\d, 方法findall() 将返回一个匹配字符串的列表,例如 ['415-555-9999' , '212-555-0000']
b. 如果调用在一个有分组的正则表达式上,例如 (\d\d\d)-(\d\d\d)-(\d\d\d\d),方法findall() 方法将返回一个字符串的元组列表(每个分组对应一个字符串),例如 [('415','555','1122'),('212','555','0000')] -
字符分类
\d 0-9的任意数字
\D 除0-9的数字以外的任何字符
\w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
\W 除字母、数字和下划线以外的任何字符
\s 空格、制表符或换行符(可以认为是匹配“空白”字符)
\S 除空格、制表符和换行符以外的任何字符 -
建立自己的字符分类
^ : 通常在字符分类的左括号后加上一个插入字符(^),就可以得到“”非字符类 -
插入字符和美元字符
在正则表达式的开始处使用插入(^),表明匹配必须发生在被查找文本开始处。
在正则表达式的末尾加上美元符号($),表示该字符串必须以这个正则表达式的模式结束。 -
通配符
在正则表达式中,.(句号)字符称为“通配符”。匹配除了换行之外的所有字符。
a. 用 点-星(.*) 匹配所有字符,点-星使用“贪心模式”。
b. 用句点字符匹配换行
通过传入 re.DOTALL 作为re.compile() 的第二个参数,可以让句点字符匹配所有字符,包括换行符。 -
不区分大小写的匹配
向re.compile() 传入re.IGNORECASE 或 re.I ,作为第二个参数。 -
用sub() 方法替换字符串
Regex对象的 sub() 方法需要传入两个参数。第一个参数是一个字符串,用于取代发现的匹配。第二个参数是一个字符串,用于正则表达式匹配的内容。
举个例子:
agentname = re.compile(r'Agent (\w) \w*')
agentname.sub(r'\1****' , ' Agent Alice told Agent Carol that Agent Ene knew Agent Bob was a double agent. ')
result: ' A**** told C**** that E**** knew B**** was a double agent.'
-
管理复杂的正则表达式
向 re.compile() 传入参数 re.VERBOSE ,作为第二个参数,忽略正则表达式字符串中的空白符和注释。 -
组合使用 re.DOTALL 、re.IGNORECASE 和 re.VERBOSE
使用管道字符(|)
网友评论