re 正則表達式操作 本模塊提供了類似於Perl的正則表達式匹配操作。要匹配的模式和字元串可以是Unicode字元串以及8位字元串。 正則表達式使用反斜杠字元('\')來表示特殊的形式或者來允許使用特殊的字元而不要啟用它們特殊的含義。這與字元串字面值中相同目的的相同字元的用法衝突;例如,要匹配一個反 ...
re 正則表達式操作
本模塊提供了類似於Perl的正則表達式匹配操作。要匹配的模式和字元串可以是Unicode字元串以及8位字元串。
正則表達式使用反斜杠字元('\')來表示特殊的形式或者來允許使用特殊的字元而不要啟用它們特殊的含義。這與字元串字面值中相同目的的相同字元的用法衝突;例如,要匹配一個反斜線字面值,你必須寫成'\\\\'作為模式字元串,因為正則表達式必須是\\,每個反斜線在Python字元串字面值內部必須表達成\\。
解決的辦法是使用Python的原始字元串符號表示正則表達式的模式;在以'r'為首碼的字元串字面值中,反斜杠不會以任何特殊的方式處理。所以r"\n"是一個包含'\'和'n'兩個字元的字元串,而"\n"是包含一個換行符的單字元字元串。通常在Python代碼中,模式的表示使用這種原始字元串符號。
重要的註意事項是大部分正則表達式操作可以利用模塊級別的函數和RegexObject的方法。這些函數是快捷的方式,它們不要求你首先編譯一個正則表達式對象,但會遺漏一些調優的參數。
請參見
- Mastering Regular Expressions 《精通正則表達式》
- O’Reilly 該書第 2 版不再涵蓋Python內容,但其第 1 版中涵蓋了很多寫得不錯、非常詳細的正則表達式模式。
7.2.1. 正則表達式語法
正則表達式(或RE)指定一組匹配它字元串;此模塊中的函數讓你檢查一個特定的字元串是否匹配給定的正則表達式(或給定的正則表達式是否匹配特定的字元串,這可歸結為同一件事)。
正則表達式可以連接以形成新的正則表達式;如果A和B兩個都是正則表達式,那麼AB也是正則表達式。一般來說,如果字元串p匹配A且另一個字元串q匹配B,那麼字元串pq將匹配AB。除非A或B包含低優先順序的操作;A和B之間存在邊界條件;或有編號的組的引用。因此,複雜的表達式可以輕鬆地從這裡所描述的更簡單的原始表達式構建。關於理論的細節及正則表達式的實現,請參閱上文引用的Friedl的書或任何一本有關編譯器構造的教科書。
下麵簡要說明瞭正則表達式的格式。進一步的信息和更友好的演示,請參閱正則表達式HOWTO。
正則表達式可以包含特殊和普通字元。最普通的字元,如'A'、'a'、或'0'是最簡單的正則表達式;它們簡單地匹配它們自己。你可以連接普通字元,所以last匹配字元串'last'。(在本節剩下的部分,我們將把正則表達式寫成不帶引號的形式這種獨特風格,要匹配的字元串寫成帶引號的形式'用單引號'。)
某些字元,比如'|'或'(',比較特殊。特殊字元要麼表示某個類別的普通字元,要麼影響它們周圍的正則表達式如何解釋。正則表達式的模式字元串不可以包含空位元組,但可以使用\number符號指定空位元組,例如'\x00'。
特殊字元有:
- '.'
- (點號。)在預設模式下,匹配除換行以外的任意字元.如果 DOTALL 標誌被指定, 則匹配包括換行符在內的所有字元.
- '^'
- (脫字元號。)在預設模式下匹配字元串的起始位置, 在MULTILINE模式下也匹配換行符之後的位置.
- '$'
- 匹配字元串的末尾或者字元串末尾換行符之前的位置,在MULTILINE模式下還匹配換行符之前的位置。foo既匹配‘foo’也匹配‘foobar’,但是foo$只匹配‘foo’。更有趣的是,正常情況下foo.$只匹配'foo1\nfoo2\n' ‘foo2’,但是在MULTILINE模式下還能匹配‘foo1’;在'foo\n'中搜索單個$將找到兩個(空的)匹配:一個是換行符之前,一個是字元串的末尾。
- '*'
- 匹配前面重覆出現的正則表達式零次或多次,儘可能多的匹配。ab*將匹配‘a’、‘ab’或‘a’ 後面跟隨任意數目的‘b’。
- '+'
- 引起生成的RE匹配1個或多個前導的RE,儘可能多的匹配。ab+將匹配‘a’之後跟隨任意多個數目不為零的‘b’,它將不能匹配單純的一個‘a’。
- '?'
- 引起生成的RE匹配0個或1個前導的RE。ab?將匹配‘a’或者‘ab’。
- *?, +?, ??
- '*'、'+'和'?'限定符是貪婪的; 它們匹配儘可能多的文本。有時這個行為不是想要的;如果用正則表達式<.*>來匹配'<H1>title</H1>',它將匹配完整的字元串,而不會只是'<H1>'。在限定符之後加上'?'將使得匹配以非貪婪的或最小的方式進行;因為它將匹配儘可能少的字元。在剛纔的表達式中使用.*?將只匹配'<H1>'。
- {m}
- 表示精確匹配前面的正則表達式的m個拷貝;較少的匹配將導致整個表達式不能匹配。例如,a{6}將精確匹配6個'a'字元,5個將不能匹配。
- {m,n}
- 引起生成的正則表達式匹配前導正則表達式的m到n個重覆,嘗試匹配儘可能多的重覆。例如,a{3,5}將匹配3到5個'a'字元。省略m表示下界為0,省略n表示上界無限大。舉個例子,a{4,}b將匹配aaaab或一千個'a'字元後跟隨一個b,但不能匹配aaab。逗號不可以省略,否則該修改符將與前面的形式混淆。
- {m,n}?
- 例如,對於6個字元的字元串'aaaaaa',a{3,5}將匹配5個'a'字元,而a{3,5}?將只匹配3個字元。
- '\'
-
對任一特殊字元進行轉義(允許您匹配字元(如'*',' ? ',等等),或只是一個特殊的序列;特殊序列在下麵討論。
如果你不使用原始字元串來表達模式,記住在字元串字面值中Python也使用反斜杠作為轉義序列;如果轉義序列不能被Python解析器識別,那麼結果字元串中包含反斜杠和後面的字元。但是,如果Python會識別所產生的序列,反斜杠應該重覆兩次。這比較複雜和難以理解,因此強烈建議你為所有即使是最簡單的表達式使用原始字元串。
- []
-
用來表示一個字元集合。在一個集合中:
- 字元可以一個一個列出來,例如[amk]將匹配'a'、'm'或'k'。
- 通過給出兩個字元並用'-'分隔,可以給出一段範圍的字元,例如[a-z]將匹配任意一個小寫的ASCII字元,[0-5][0-9]將匹配00到59之間所有的兩位數字,[0-9A-Fa-f]將匹配任意一個十六進位數字。如果-被轉義(例如[a\-z])或者如果它位於第一個或最後一個字元(例如[a-]),它將只匹配一個字面值'-'。
- 在集合內部,特殊字數將失去它們特殊的含義。例如,[(+*)]將匹配字元字面值'('、'+'、'*'或')'。
- 在集合中還接受字元類別,例如\w或\S(在下文定義),儘管它們匹配的字元取決於LOCALE或UNICODE模式是否是強制的。
- 不在一段範圍之內的字元可以通過補集匹配。如果集合的第一個字元是'^',那麼所有不在集合中的字元都將被匹配。例如,[^5]將匹配除'5'之外的所有字元,[^^]將匹配除'^'之外的所有字元。^如果不是集合中的第一個字元則沒有特殊的含義。
- 若要匹配集合中的一個字元字面值']',可以在它前面放一個反斜線或者將它放在集合的開始。例如,[()[\]{}]和[]()[{}]都將匹配一個圓括弧。
- '|'
- A|B, 此處的 A 和 B 可以是任意的正則表達式, 創建的這個正則表達式要麼匹配 A 要麼匹配 B. '|'可以用來隔開任意個數的正則表達式,著同樣可以用在組裡面。 當掃描字元串時,REs 被用'|'從左到右分隔。當一個模式被完全匹配時,這個被匹配的模式就被接受。這意味著一旦 匹配A , B 就不在被嘗試, 即使他會產生更長的整體匹配. 換句話說, '|' 不是貪婪操作符. 匹配符號 '|',用 |, 或者把它包含在組內, 就像是 [|].
- (...)
- 匹配任何在圓括弧內的正則表達式, 並表明分組的開始和結束; 分組的內容在完成匹配後可以提取出來,而且可以在後面的字元串中用特殊的number序列匹配,下麵有描述。若要匹配字面值'('或')',請使用( or ),或它們放入字元類的括弧中:[(] [)]。
- (?...)
- This is an extension notation (a '?' following a '(' is not meaningful otherwise). The first character after the '?' determines what the meaning and further syntax of the construct is. Extensions usually do not create a new group; (?P<name>...) is the only exception to this rule.Following are the currently supported extensions.
- (?iLmsux)
-
(集合'i', 'L', 'm', 's', 'u', 'x'中的一個或多個字母。)這個分組空字元串;這些字母給真個正則表達式設置相應的標記:
re.I
(忽略大小寫),re.L
(依賴區域設置),re.M
(多行),re.S
(點號匹配所有字元),re.U
(依賴Unicode),re.X
(詳細模式)。(這些標誌在模塊的內容中講述)。它用於如果你想要包含這些標誌作為正則表達式的一部分,而不是將flag參數傳遞給re.compile()函數。請註意,(?x)標誌更改解析表達的方式。它應使用在表達式字元串的開始,或一個或多個空白字元之後。如果在這個標誌之前有非空白字元,結果是未定義的。
- (?:...)
- 括弧形式的正則表達式的非匹配版本。匹配括弧中的任何正則表達式,但是匹配的子字元串不能在匹配後提取或在模式中引用。
- (?P<name>...)
-
通過符號組名稱name可以訪問類似於常規的括弧,但由組匹配的子字元串。組名必須是有效的 Python 標識符,並且每個組名必須在正則表達式內只有一次定義。海員象徵性的組織也是帶編號的組,就好像組未被命名。
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
- (?P=name)
- A backreference to a named group; 反向關聯一個已被命名的字元串組。 它將匹配之前被關聯到name中的所有內容。
- (?#...)
- 一條註釋;圓括弧內容可簡單忽略。
- (?=...)
- Matches if ... matches next, but doesn’t consume any of the string. This is called a lookahead assertion. For example, Isaac (?=Asimov) will match 'Isaac ' only if it’s followed by 'Asimov'.
- (?!...)
- Matches if ... doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match 'Isaac ' only if it’s notfollowed by 'Asimov'.
- (?<=...)
-
如果在字元串中的當前位置之前由...匹配項的比賽,在當前的位置結束。這就被所謂的積極回顧後發斷言。 (? < = abc) def將發現一個匹配abcdef,因為預測先行將備份 3 個字元,並檢查是否包含的模式匹配。包含的模式必須只匹配固定長度的字元串,這意味著允許abc 或a|b 的,但a* 和a{3,4} 不允許。請註意,開始與正預測先行斷言的模式將不匹配開頭的字元串被搜查 ;您將最有可能想要使用search ()函數,而不是match ()函數:
>>> import re >>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0) 'def'
本示例查看後面一個連字元的詞:
>>> m = re.search('(?<=-)\w+', 'spam-egg') >>> m.group(0) 'egg'
- (?<!...)
- 如果字元串的當前位置不匹配之前的 .... 這叫做 否定性回顧斷言. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched.
- (?(id/name)yes-pattern|no-pattern)
-
Will try to match with yes-pattern if the group with given id or name exists, and with no-pattern if it doesn’t. no-pattern is optional and can be omitted. For example, (<)?(w+@w+(?:.w+)+)(?(1)>) is a poor email matching pattern, which will match with '<[email protected]>' as well as '[email protected]', but not with '<[email protected]'.
在 2.4 版本新。
- \number
- Matches the contents of the group of the same number. Groups are numbered starting from 1. For example, (.+) 1 matches 'the the' or '55 55', but not 'thethe' (note the space after the group). This special sequence can only be used to match one of the first 99 groups. If the first digit of number is 0, or number is 3 octal digits long, it will not be interpreted as a group match, but as the character with octal value number.Inside the '[' and ']' of a character class, all numeric escapes are treated as characters.
- \A
- Matches only at the start of the string.
- \b
- Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of alphanumeric or underscore characters, so the end of a word is indicated by whitespace or a non-alphanumeric, non-underscore character.Note that formally, is defined as the boundary between a w and a W character (or vice versa), or between w and the beginning/end of the string, so the precise set of characters deemed to be alphanumeric depends on the values of the UNICODE and LOCALE flags. For example, r'\bfoo\b' matches 'foo', 'foo.', '(foo)','bar foo baz' but not 'foobar' or 'foo3'. Inside a character range, represents the backspace character, for compatibility with Python’s string literals.
- \B
- Matches the empty string, but only when it is not at the beginning or end of a word. This means that r'py\B' matches 'python', 'py3', 'py2', but not 'py', 'py.', or 'py!'.\B is just the opposite of \b, so is also subject to the settings of LOCALE and UNICODE.
- \d
- When the UNICODE flag is not specified, matches any decimal digit; this is equivalent to the set [0-9].With UNICODE, it will match whatever is classified as a decimal digit in the Unicode character properties database.
- \D
- When the UNICODE flag is not specified, matches any non-digit character; this is equivalent to the set [^0-9]. With UNICODE, it will match anything other than character marked as digits in the Unicode character properties database.
- \s
- When the UNICODE flag is not specified, it matches any whitespace character, this is equivalent to the set [ \t\n\r\f\v]. The LOCALE flag has no extra effect on matching of the space. If UNICODE is set, this will match the characters [ \t\n\r\f\v] plus whatever is classified as space in the Unicode character properties database.
- \S
- When the UNICODE flags is not specified, matches any non-whitespace character; this is equivalent to the set [^ \t\n\r\f\v]. The LOCALE flag has no extra effect on non-whitespace match. If UNICODE is set, then any character not marked as space in the Unicode character properties database is matched.
- \w
- When the LOCALE and UNICODE flags are not specified, matches any alphanumeric character and the underscore; this is equivalent to the set [a-zA-Z0-9_]. With LOCALE, it will match the set [0-9_] plus whatever characters are defined as alphanumeric for the current locale. If UNICODE is set, this will match the characters [0-9_] plus whatever is classified as alphanumeric in the Unicode character properties database.
- \W
- When the LOCALE and UNICODE flags are not specified, matches any non-alphanumeric character; this is equivalent to the set [^a-zA-Z0-9_]. WithLOCALE, it will match any character not in the set [0-9_], and not defined as alphanumeric for the current locale. If UNICODE is set, this will match anything other than [0-9_] plus characters classied as not alphanumeric in the Unicode character properties database.
- \Z
- 只在字元串的結尾處進行匹配
如果區域設置和UNICODE標誌包括為一個特定的序列,區域設置標誌可將第一次跟著UNICODE的生效。
由正則表達式分析器也接受大多數支持通過 Python 字元串的標準轉義:
\a \b \f \n
\r \t \v \x
\\
(請註意,用來表示單詞邊界,並意味著"退格鍵"只能在字元類的內部。)
八進位轉義中有限的形式包括: 如果第一個數字為 0,或者如果有三個八進位數字,它被認為是八進位轉義符。否則,它是組引用。字元串文本總是八進位轉義頂多是三個數字的長度。
1.2. Module Contents
模塊定義了幾個函數、 常量和異常。某些功能是充分的特色方法的已編譯的正則表達式的簡化的版本。大多數非平凡應用程式總是使用的已編譯的形式。
- re.compile(pattern, flags=0)
-
將正則表達式模式編譯成一個正則表達式對象,它可以用於匹配使用它的match ()和search ()方法,如下所述。
可以通過指定flags值修改表達式的行為。值可以是任何以下變數,使用組合 OR ( |運算符)。
序列
prog = re.compile(pattern) result = prog.match(string)
等效於
result = re.match(pattern, string)
但使用re.compile()和保存所產生的正則表達式對象重用效率更高時該表達式會在單個程式中多次使用。
註
傳遞給re.match()、 re.search()或re.compile()的最新模式的已編譯的版本進行緩存,所以只有幾個正則表達式的程式使用一次不必擔心編譯正則表達式。
- re.DEBUG
-
顯示調試信息編譯的表達式。
- re.I
- re.IGNORECASE
-
執行不區分大小寫的匹配 ;如[A-Z]表達式將太匹配小寫字母。這不被受當前的區域設置。
- re.L
- re.LOCALE
-
Make \w, \W, \b, \B, \s and \S dependent on the current locale.