re.match(pattern, string, flags=0)
函数参数说明:
| 参数 | 描述 |
|---|---|
| pattern | 匹配的正则表达式 |
| string | 要匹配的字符串。 |
| flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
| 修饰符 | 描述 |
|---|---|
| re.I | 使匹配对大小写不敏感 |
| re.L | 做本地化识别(locale-aware)匹配 |
| re.M | 多行匹配,影响 ^ 和 $ |
| re.S | 使 . 匹配包括换行在内的所有字符 |
| re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
| re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
1).re.I(re.IGNORECASE): 忽略大小写
2).re.M(MULTILINE): 多行模式,改变'^'和'$'的行为
3).re.S(DOTALL): 点任意匹配模式,改变'.'的行为
4).re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
5).re.U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
6).re.X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释
这四个方法是从某个字符串中寻找特定子串或判断某个字符串是否符合某个模式的常用方法。
re.match(pattern, string[, flags])
从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。
re.search(pattern, string[, flags])
若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个。
re.findall(pattern, string[, flags])
返回string中所有与pattern相匹配的全部字串,返回形式为数组。
re.finditer(pattern, string[, flags])
返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。
若匹配成功,match()/search()返回的是Match对象,finditer()返回的也是Match对象的迭代器,获取匹配结果需要调用Match对象的group()、groups或group(index)方法。
Python 的re模块提供了re.sub用于替换字符串中的匹配项。
re.sub(pattern, repl, string, count=0)
参数:
返回替换后的字符串
import re
# 示例1 re.search
page = '''
<server name="歌词服务器(电信)" url="http://ttlrcct2.qianqian.com/dll/lyricsvr.dll" />
'''
pattern = re.compile('name="(.*?)" url="(.*?)" />', re.S)
result = re.search(pattern, page) # type: <class '_sre.SRE_Match'>
print('result.groups(): ', result.groups())
print('result.group(): ', result.group())
print('result.group(0): ', result.group(0))
print('result.group(1): ', result.group(1))
print('result.group(2): ', result.group(2))
# 示例2 re.findall
page = '''
<server name="歌词服务器(电信)" url="http://ttlrcct2.qianqian.com/dll/lyricsvr.dll" />
<server name="歌词服务器(联通)" url="http://ttlrcct3.qianqian.com/dll/lyricsvr.dll" />
<server name="歌词服务器(移动)" url="http://ttlrcct4.qianqian.com/dll/lyricsvr.dll" />
'''
pattern = re.compile('name="(.*?)" url="(.*?)" />', re.S)
result = re.findall(pattern, page) # type: <class 'list'>
print(result) # [('xxx', 'xxx'), ('xxx', 'xxx'), ('xxx', 'xxx')]
for eachServer in result:
print("%s, %s" % (eachServer[0], eachServer[1]))
# 示例3 re.findall
pattern = re.compile('name="(.*?)"', re.S)
result = re.findall(pattern, page) # type: <class 'list'>
print(result) # ['xxx', 'xxx', 'xxx']
综上:
[(...), (...)],如果groups元组只有一个元素,那findall的是字符串的list,而不是元组的list。