1.迭代器:对象在其内部实现了iter(),__iter__()方法,可以用next方法实现自我遍历。
二.python正则表达式
1.python通过re模块支持正则表达式
2.查看当前系统有哪些python模块:help('modules')
help():交互式模式,支持两种方式调用(交互式模式调用,函数方式调用)
例:交互式调用
>>> help()
Welcome to Python 3.5's help utility!
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/3.5/tutorial/.
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics". Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".
help> modules
函数式调用
help('modules')
3.正则表达式的元字符
\s :空白符;
\S :非空白符;
[\s\S] :任意字符;
[\s\S]* :0个到多个任意字符;
[\s\S]*? : 0个字符,匹配任何字符前的位置;
\d:数字;
\B:非数字 ;
\w:匹配单词 单词等价于:[a-zA-Z0-9_];
\W:匹配非单词;
规则:
. 匹配任意单个字符;
* 匹配前一个字符0次或多次;
+ 匹配前一个字符1次或多次;
? 匹配前一个字符0次或一次;
{m} 匹配前一个字符m次;
{m,n} 匹配前一个字符 m - n 次;
{m,} 匹配前一外字符至少 m次 至多无限次;
{,n} 匹配前一个字符 0 到 n次;
\ 转义字符;
[...] 字符集 例:[a-z];
.*? *? +? ?? {}? 使* + 等 变成非贪婪模式
边界匹配(不消耗待匹配的待匹配字符串的字符)
^:匹配字符串开头,在多行模式中匹配每一行的行首;
$:匹配字符串结尾,在多行模式中匹配每一行的行尾;
\b:匹配单词边界,不匹配任何字符,\b匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非字符、字符串的开始或结束位置,\b是零宽度的。(“单词”是由\w所定义的单词子串) \b相当于:(?<!\w)(?=\w)|(?<=\w)(?!\w);
\B:[^\b];
\A:仅匹配字符串开头;
\Z:仅匹配字符串结尾;
分组:
| 或,左右表达式任意匹配一个,它先尝试匹配 | 左边的表达式,如果匹配成功则跳过匹配右边的表达式;如果 | 没有被包括在()中,则它在范围是整个正则表达式。
() 分组 ;从表达式左边开始,第遇到一个分组,编号加1;分组表达式作为一个整体,后面可接数量词;分组表达式中的 | 仅在该分组中有效。 例:(abc){3} (abc|def)123 (abc|def){3}123
\number 引用编号为 number 的分组匹配到的字符串。 例:(\d)([a-z])\1\2
环视(lookhead)
(?=) :顺序肯定环视
(?!) :顺序否定环视
(?<=) :逆序肯定环视
(?<!) :逆序否定环视
4.调用re的内置方法完成正则表达式分析
5.match(匹配)对象:
match(pattern, string, flags=0)
Try to apply the pattern at the start of the string, returning
a match object, or None if no match was found.
m = re.match('a','abc')
所有:
m.end m.group m.lastgroup m.re m.start
m.endpos m.groupdict m.lastindex m.regs m.string
m.expand m.groups m.pos m.span
group([group1, …]):
获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。
groups([default]):
以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。
m.pos (pos:postion):返回从哪个位置开始搜索
m.endpos:返回从哪个位置结束搜索
m.start():返回指定pattern在作匹配时所截获的子串在原串的起始位置
m.end():返回指定pattern在作匹配时所截获的子串在原串的结束位置
6.search:执行正则表达式搜索并且在搜索结束后返回所匹配到的串,只返回第一次匹配到的结果
search(pattern, string, flags=0)
Scan through string looking for a match to the pattern, returning
a match object, or None if no match was found.
m.group()
m.groups()
7.findall :匹配所有的对象,返回一个列表
findall(pattern, string, flags=0)
Return a list of all non-overlapping matches in the string.
If one or more capturing groups are present in the pattern, return
a list of groups; this will be a list of tuples if the pattern
has more than one group.
Empty matches are included in the result.
直接打印结果
8.finditer(用的不多)
finditer(pattern, string, flags=0)
Return an iterator(迭代器) over all non-overlapping matches in the
string. For each match, the iterator returns a match object.
Empty matches are included in the result.
9.split
split(pattern, string, maxsplit=0, flags=0)
Split the source string by the occurrences of the pattern,
returning a list containing the resulting substrings. If
capturing parentheses are used in pattern, then the text of all
groups in the pattern are also returned as part of the resulting
list. If maxsplit is nonzero, at most maxsplit splits occur,
and the remainder of the string is returned as the final element
of the list.
例:a = re.split('\.','www.baidu.com')
直接打印结果
10.sub:实现查找替换
sub(pattern, repl, string, count=0, flags=0)
Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is
a callable, it's passed the match object and must return
a replacement string to be used.
例:In [47]: re.sub('baidu','BAIDU','www.baidu.com')
Out[47]: 'www.BAIDU.com'
11.subn :查找替换,并显示替换的次数
例:
In [48]: re.subn('baidu','BAIDU','www.baidu.com')
Out[48]: ('www.BAIDU.com', 1)
flags:
re.I或IGNORECASE:忽略字符大小写
re.M或MULTILINE:多行匹配
re.A或ASCII:仅执行8位的ASCII码字符匹配
re.U或UNICODE:使用\w,\W
re.S (DOTALL): "." matches any character at all, including the newline. 使 . 可以匹配 \n 符。
re.X (VERBOSE): Ignore whitespace and comments for nicer looking RE's. 允许在正则表达式规则中加入注释,但默认会去掉所有空格。
12.去除优先捕获:
xxx(?:)xxx
?: :分组时去除优先捕获
?P<> :
(?P<name>...)
Similar to regular parentheses, but the substring matched by the group is accessible via the symbolic group name name. Group names must be valid Python identifiers, and each group name must be defined only once within a regular expression. A symbolic group is also a numbered group, just as if the group were not named.
Named groups can be referenced in three contexts. If the pattern is (?P<quote>['"]).*?(?P=quote) (i.e. matching a string quoted with either single or double quotes):
Context of reference to group “quote” Ways to reference it
in the same pattern itself
(?P=quote) (as shown)
\1
when processing match object m
m.group('quote')
m.end('quote') (etc.)
in a string passed to the repl argument of re.sub()
\g<quote>
\g<1>
\1