python正则表达式总结

match/search会缓存最近的对象

re.compile返回的是一个正则表达式对象。
下面两种方式等效,在使用正则较少的情况下不用太担心直接使用re.match的性能问题,因为match/search会缓存最近的对象。

pat = re.compile(pattern)
result = pat.match(string)
# is equivalent to
result = re.match(pattern, string)

re对象的方法

Method/Attribute Purpose
match() Determine if the RE matches at the beginning of the string.
search() Scan through a string, looking for any location where this RE matches.
findall() Find all substrings where the RE matches, and returns them as a list.
finditer() Find all substrings where the RE matches, and returns them as an iterator.

matchsearch在没有找到匹配时返回None,找到时返回match object。

match object的方法

Method/Attribute Purpose
group() Return the string matched by the RE
start() Return the starting position of the match
end() Return the ending position of the match
span() Return a tuple containing the (start, end) positions of the match

match还是search?还是find*?

match只检查字符串从0位置开始是否符合,而search则会搜索整个字符串。
search只搜索自一次匹配,而findall则会搜索完整个字符串提供所有匹配。

贪婪和非贪婪方式

*,+,?等都是贪婪方式。但是后面加个?号改为匹配尽可能少的字符,即*?,+?,??,{m,n}?

标识

Flag Meaning
DOTALL, S Make . match any character, including newlines
IGNORECASE, I Do case-insensitive matches
LOCALE, L Do a locale-aware match
MULTILINE, M Multi-line matching, affecting ^ and $
VERBOSE, X Enable verbose REs, which can be organized more cleanly and understandably.
UNICODE, U Makes several escapes like \w, \b, \s and \d dependent on the Unicode character database.

一些定位元字符

Metacharacter Meaning
| or
^ 行首
$ 行位
\A 字符串首
\Z 字符串尾
\b 单词边界
\B 非单词边界

group分组

group()group(0)是匹配串,group(n)[n>0]是第n个子分组, group(L,m,n)可以接受多个index返回元祖,groups()返回所有匹配子组。

非捕获组(?:…)和命名组(?P…)

非捕获组不能后向引用了,比如只需要单词或的匹配但是又不想捕获它时。
(...)\1使用序号后向引用,(?P<name>...)(?P=name)后向引用命名组。

Lookahead Assertions

(?=...)确定性断言,(?!...)否定性断言。

简单分支判断

(?(id/name)yes-pattern|no-pattern)提供一个简单的分支判断,如果id/name组存在匹配,就检索匹配yes-pattern,否则检索匹配no-pattern,否定项可选可省略。

发表评论

电子邮件地址不会被公开。 必填项已用*标注