很喜欢Python教材中的这句格言:
有些人面临问题时会想:“我知道, 我将使用正则表达式来解决这个问题.”
这让他们面临的问题变成了两个. ---------Jamie Zawinski
正则表达式的确好用,但是复杂的模式难以阅读和维护,与其把花在研究用正则表达式处理复杂的问题上,还不如把时间花在如何写一套清晰,易维护的逻辑上(但是为什么要用,还是因为爽啊)
关于正则表达式的语法,可以参阅我的这篇[学习笔记]正则表达式语法与使用速查
re模块
“我觉得学习是一个循序渐进的过程,所以我不一次性列出所有的函数,这里只列出例子要用的函数.”
函数 | 描述 |
---|---|
compile(pattern,[, flags]) | 根据包含正则表达式的字符串创建模式对象 |
search(pattern,string[, flags]) | 在字符串中查找模式 |
sub(pat, repl, string[, count=0]) | 对字符串中域模式pat匹配的子串都替换为repl |
函数
re.compile()
将字符串表示的正则表达式转换为模式对象,提高匹配效率,调用re.search()
等函数时,如果使用的是字符串表示的正则表达式,会在内部先转换为模式对象再使用.如果转为模式对象后,则后面每次使用正则表达式都无需进行转换.即re.search(pat,string)
等价于pat.search(string)
例如查找"http://www.python.org"
中的python
并替换为java
import re
line="http://www.python.org"
pat="(?<=\.).+(?=\.)" #两个.之间的内容
patobj=re.compile(pat) #创建模式对象
print(re.search(pat, line))
print(re.search(patobj, line)) #正则表达式与模式对象都能使用
print(patobj.search(line))
#输出结果
<re.Match object; span=(11, 17), match='python'>
<re.Match object; span=(11, 17), match='python'>
<re.Match object; span=(11, 17), match='python'>
函数
re.search
在给定字符串中查找第一个与指定pat
匹配的子串,如果找到将返回MatchObject
(结果为True
),否则为None
.(结果为False
)
观察结果<re.Match object; span=(11, 17), match='python'>
,发现MatchObject
的匹配子串为'python'
,起始与终止位置为11,17
替换为java
line1 = re.sub(pat, "java", line)
line2 = patobj.sub("java", line)
print(line1)
print(line2)
#输出结果
http://www.java.org
http://www.java.org
函数 | 描述 |
---|---|
match(pattern, string,[, flags]) | 在字符串开头匹配模式 |
split(pattern, string,[, maxsplit=0]) | 根据模式来分割字符串 |
findall(pattern, string) | 返回一个列表,其中包含字符串中所有与模式匹配的子串 |
函数
re.match
尝试在给定字符串开头查找与正则表达式匹配的子串,和re.search
相似,如果找到这样的子串,返回MatchObject
,否则返回None
另外,re.match
在模式与字符串开头匹配时就返回True