Python Raw String
在python字符串中 \
是转义序列符号,所以在编写正则表达式时,建议使用 raw string,自动将 \
当作普通字符:
# raw string
r'\n'
# 等价于字符串
'\\n'
语法
# 类似于 Django 中的 URL Pattern
In [53]: text = '<h1>hello</h1>'
In [60]: re.search(r'<h1>(?P<heading>.*)</h1>',text).group('heading')
Out[60]: 'hello'
贪心和非贪心匹配
- 贪心匹配:尽可能匹配更多的字符
- 非贪心匹配:尽可能匹配更少的字符
贪心和非贪心匹配一般区别于匹配含嵌套的对象中。python的正则表达式默认为贪心匹配,使用非贪心匹配时,仅需在表示数量的语法后加上 ?
即可,比如: *?
, +?
, {m,n}?
In [23]: text = '!Hello!World!'
# 贪心匹配
In [24]: re.search(r'!.*!', text).group()
Out[24]: '!Hello!World!'
# 非贪心匹配
In [25]: re.search(r'!.*?!', text).group()
Out[25]: '!Hello!'
模块 re
In [41]: import re
In [44]: re.search(r'\w+', 'Hello').group()
Out[44]: 'Hello'
如果要多次使用正则表达式,可以进行编译
In [45]: pattern = re.compile(r'\w+')
In [46]: re.search(pattern, 'hello').group()
Out[46]: 'hello'
常用的变量
-
re.IGNORECASE
:忽略大小写 -
re.DOTALL
:使.
包含换行符\n
In [48]: re.search('hello', 'Hello', re.IGNORECASE).group()
Out[48]: 'Hello'
常用的方法
re.search(pattern, string, flags=0)
-
re.match(pattern, string, flags=0)
:正则表达式要匹配字符串的首部 -
re.fullmatch(pattern, string, flags=0)
: 字符串要完整匹配正则表达式 re.split(pattern, string, maxsplit=0, flags=0)
-
re.findall(pattern, string, flags=0)
:返回匹配项目的列表 re.finditer(pattern, string, flags=0)
-
re.sub(pattern, repl, string, count=0, flags=0)
:substitute 替换
In [50]: re.search(r'world', 'hello world')
Out[50]: <_sre.SRE_Match object; span=(6, 11), match='world'>
In [51]: re.match(r'world', 'hello world')
# 无匹配结果
In [52]:
归组
In [62]: re.search(r'(\w+)://(.+)', url, re.DOTALL).group()
Out[62]: 'https://www.google.com'
In [63]: re.search(r'(\w+)://(.+)', url, re.DOTALL).group(1)
Out[63]: 'https'
In [64]: re.search(r'(\w+)://(.+)', url, re.DOTALL).group(2)
Out[64]: 'www.google.com'
# 参数 0 和不传递参数的结果一样
In [65]: re.search(r'(\w+)://(.+)', url, re.DOTALL).group(0)
Out[65]: 'https://www.google.com'
给定变量名
In [66]: re.search(r'(?P<protocol>\w+)://(?P<url>.+)', url, re.DOTALL).group()
Out[66]: 'https://www.google.com'
In [67]: re.search(r'(?P<protocol>\w+)://(?P<url>.+)', url, re.DOTALL).group('protocol')
Out[67]: 'https'
In [68]: re.search(r'(?P<protocol>\w+)://(?P<url>.+)', url,re.DOTALL).group('url')
Out[68]: 'www.google.com'