python re模塊

来源:http://www.cnblogs.com/MrFiona/archive/2016/10/12/5954084.html
-Advertisement-
Play Games

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)指定一組匹配它字元串;此模塊中的函數讓你檢查一個特定的字元串是否匹配給定的正則表達式(或給定的正則表達式是否匹配特定的字元串,這可歸結為同一件事)。

正則表達式可以連接以形成新的正則表達式;如果AB兩個都是正則表達式,那麼AB也是正則表達式。一般來說,如果字元串p匹配A且另一個字元串q匹配B,那麼字元串pq將匹配AB。除非AB包含低優先順序的操作;AB之間存在邊界條件;或有編號的組的引用。因此,複雜的表達式可以輕鬆地從這裡所描述的更簡單的原始表達式構建。關於理論的細節及正則表達式的實現,請參閱上文引用的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}
引起生成的正則表達式匹配前導正則表達式的mn個重覆,嘗試匹配儘可能多的重覆。例如,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]將匹配0059之間所有的兩位數字,[0-9A-Fa-f]將匹配任意一個十六進位數字。如果-被轉義(例如[a\-z])或者如果它位於第一個或最後一個字元(例如[a-]),它將只匹配一個字面值'-'
  • 在集合內部,特殊字數將失去它們特殊的含義。例如,[(+*)]將匹配字元字面值'(''+''*'')'
  • 在集合中還接受字元類別,例如\w\S(在下文定義),儘管它們匹配的字元取決於LOCALEUNICODE模式是否是強制的。
  • 不在一段範圍之內的字元可以通過補集匹配。如果集合的第一個字元是'^',那麼所有在集合中的字元都將被匹配。例如,[^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(patternflags=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.

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前兩天朋友問我,有沒有使用過StackExchange.Redis,問我要個封裝類,由於之前都是使用ServiceStack.Redis,由於ServiceStack.Redis v4版本後是收費版的,所以現在也很有公司都在使用StackExchange.Redis而拋棄ServiceStack.R ...
  • ASP.NET Core請求處理管道由一個伺服器和一組中間件構成。如果想非常深刻地認識ASP.NET Core的請求處理管道,我覺得可以分兩個步驟來進行:首先,我們可以在忽略具體細節的前提下搞清楚管道處理HTTP請求的總體流程;在對總體流程有了大致瞭解之後,我們再來補充這些刻意忽略的細節。為了讓讀者... ...
  • 摘要:任何語言開發出來的程式,都會有一個程式入口函數,可能每個語言所使用的程式入口函數名稱不一樣,但是它們的作用都是一樣的,都是被操作系統去調用。那麼本文主要總結.NET中的程式入口函數Main使用的小技巧。 引言 最近在使用pandoc這個文檔轉換軟體,能夠對各種文檔進行完美的轉換,比如從mark ...
  • 絕對佈局Absolute 通過放大或縮小界面的時候,組件大小和位置不會發生變化 浮動佈局FlowLayout 調整應用程式視窗的大小時,組件將立刻重新排列 邊界佈局Border Layout 該位置有5個方位:東、南、西、北、中 網格佈局Grid Layout 如需要將大量組件按規律排列,那麼網格布 ...
  • 最近手頭的工作不太繁重,自己試著倒騰了一套用開源框架組建的 JavaWeb 後端解決方案。 感覺還不錯的樣子,但實踐和項目實戰還是有很大的落差,這裡只做拋磚引玉之用。 項目 git 地址:https://git.oschina.net/LanboEx/sdh.git 大體採用的開源項目有:Sprin ...
  • 在使用R的時候會發現R對CPU的利用率並不是很高,反正當我在使用R的時候,無論R做何種運算R的CPU利用率都只有百分子幾,這就導致一旦計算量大的時候計算時間非常長,會給人一種錯覺(R真的在計算嗎?會不會我的程式死掉了?)。今天,我看到了一篇博客介紹的方法,迫不及待的嘗試了一下,只能說:太牛逼了!下麵 ...
  • 當滑鼠點擊和放開時發生動作事件; 方法摘要: actionPerformed(ActionEvent e) 發生操作時調用。 列: public class shijian extends Frame{ public static void main(String[] args) { Frame f ...
  • 問題:從 XE4 以來,Firemonkey 曲線繪圖在移動平臺不平滑的問題一直令人詬病,提交到官方的 QC 也是族繁不及備載,官方似乎有意的避開這個問題,遲遲沒有修正。 適用版本:XE4 ~ Berlin 10.1 update 1 (查過官方源碼從 XE4 開始有 FMX.StrokeBuild ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...