python正则表达式

概念

通配符  .
对特殊字符进行转义  'python\\.org' r'python\.org'
字符集  [a-z0-9]python   [^abc].ython
选择符和子模式  p(ython|erl)
可选 项和重复子模式  r'http://'?(www\.)?python\.org'  ,r'w{3,4}\.python\.org'
字符的开始与结尾 r'^http.lifei.com$'

元字符

代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数据或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

常用限定符

代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
n 重复n次
n, 重复n次或更多次
n,m 重复n到m次

re模块的内容

函数 描述
compile(pattern[,flags]) 根据包含正则表达式的字符串创建模式对像
search(pattern,string[,flags]) 在字符串中寻找模式
match(pattern,string[,flags]) 在字符串的开始处匹配模式
split(pattern,string[,maxsplit=0]) 根据模式的匹配项来分割字符串
findall(pattern,string) 列出字符串中模式的所有匹配项,以列表的形式存在
finditer(pattern, string, flags=0)在输入字符串中找到所有匹配内容,如果匹配成功,则返回可迭代的对象
sub(pat,repl,string[,count=0]) 将字符串中所有pat的切尔西项用repl替换
escap(string) 将字符串中所有特殊正则表达式字符转义
>>> import re
>>> aa=re.escape('python.com')
>>> aa
'python\\.com'



>>> pattern=r'[pj]ython\.com'
>>> some_test='this is python test'

>>> re.search(pattern,some_test)
>>> some_test='this is python.com test'
>>> re.search(pattern,some_test)
<_sre.SRE_Match object at 0x10cde9a58>

>>> re_pattern=re.compile(pattern)
>>> re_pattern.search(some_test)
<_sre.SRE_Match object at 0x10cde9ac0>
>>> re_pattern.findall(some_test)
['python.com']

>>> some_test
'this is python.com test'
>>> re_pattern.sub('java.com',some_test)
'this is java.com test'


>>> pattern=re.compile('lifei')
>>> pattern.sub('ok','lifei lifei lifei')
'ok ok ok'
>>> pattern.sub('ok','lifei lifei lifei',count=2)
'ok ok lifei'
>>> pattern.sub('ok','lifei lifei lifei',count=1)
'ok lifei lifei'
>>>



>>> some_test='alpha,beta,,,, gamma; delta'
>>> re.split(',',some_test)
['alpha', 'beta', '', '', '', ' gamma; delta']
>>> re.split('[,]+',some_test)
['alpha', 'beta', ' gamma; delta']
>>> re.split('[,;]+',some_test)
['alpha', 'beta', ' gamma', ' delta']
>>> some_test='alpha,beta,,;,, gamma,; delta'
>>> re.split('[,;]+',some_test)
['alpha', 'beta', ' gamma', ' delta']
>>> re.split('[,;]+',some_test,maxsplit=2)
['alpha', 'beta', ' gamma,; delta']
>>> some_test
'alpha,beta,,;,, gamma,; delta'
>>> re.split('[,;]+',some_test,maxsplit=1)
['alpha', 'beta,,;,, gamma,; delta']



re匹配对象的重要方法

方法 描述
group([group1, ,,,]) 获取给定子模式(组)的匹配项
start([group]) 返回给定组的匹配项的开始位置
end(group[]) 返回给定组匹配项的结束位置(和分片一样,不饮食组的结束位置)
span([group]) 返回一个组的开始和结束位置
>>> m=re.match(r'www\.([a-z]+)\.([a-z]+)','www.python.org')
>>> m.group(0)
'www.python.org'
>>> m.group(1)
'python'
>>> m.group(2)
'org'
>>> m.start(1)
4
>>> m.end(1)
10
>>> m.span(1)
(4, 10)


>>> re.sub(r'www\.([a-z]+)\.([a-z]+)',r'<em>\1</em>','www.python.org')
'<em>python</em>'

>>> re.sub(r'www\.([a-z]+)\.([a-z]+)',r'<em>\2</em>','hello,www.python.org')
'hello,<em>org</em>'
>>> re.sub(r'www\.([a-z]+)\.([a-z]+)',r'<em>\1</em>','hello,www.python.org')
'hello,<em>python</em>'




# 贪婪和非贪婪模式 
>>> re.sub(r'\*(.+)\*',r'<em>\1</em>','*this*is*a*dog*')
'<em>this*is*a*dog</em>'
>>> re.sub(r'\*(.+?)\*',r'<em>\1</em>','*this*is*a*dog*')
'<em>this</em>is<em>a</em>dog*'


cat templates.py
import fileinput,re
field_pat=re.compile(r'\[(.+?)\]')
scope={}
def replace(match):
    code=match.group(1)
    try:
        return str(eval(code,scope))
    except SyntaxError:
        exec code in scope
        return ''
lines=[]
for line in fileinput.input():
    lines.append(line)
text=''.join(lines)
print field_pat.sub(replace,text)


~ > cat aa.txt                                                                           
[x=2]
[y=3]
The sum of [x] and [y] is [x+y]


python templates.py aa.txt                                                              


The sum of 2 and 3 is 5


让正则表达式变得更加易读的方式是在re函数中使用VERBOSE标志。它允许在模式中添加空白(空白字符、tab、换行符,等等)。re则会忽略它们,除非将其放在字符串类或者用反斜线转义。
emphasix_pattern=re.compile(r''' #haha
\*  #Begining emphasis tag -- an asterisk
(   # Begin group for capturing phrase
[^\*] #Capture anything except asterisks
)     # End group
\*    # End emphasis tag
''',re.VERBOSE)

等价于
emphasix_pattern=re.compile(r'''*([^*])*'''

posted @ 2023-02-16 09:23  lifei888  阅读(28)  评论(0)    收藏  举报