天天看點

Python--day4--正規表達式/冒泡/時間複雜度

介紹:

本文為學習python筆記,時間為2016年12月27日 。

目錄:

正規表達式

概念

基本文法

比對格式

常用5種操作

字元比對

compile格式

實際應用

冒泡算法

時間複雜度

概念:

正規表達式,又稱規則表達式。比對規則。

基本文法:

1

2

3

4

5

6

7

8

9

<code>import</code>  <code>re  </code><code>##導入子產品</code>

<code>m </code><code>=</code> <code>re.match(</code><code>"abc"</code><code>,</code><code>"abcdefghi"</code><code>)</code>

<code>x </code><code>=</code> <code>re.match(</code><code>"abc"</code><code>,</code><code>"bcdefghi"</code><code>)</code>

<code>print</code><code>(m)</code>

<code>print</code><code>(x)</code>

<code>print</code><code>(m.group())</code>

<code>&lt;_sre.SRE_Match </code><code>object</code><code>; span</code><code>=</code><code>(</code><code>0</code><code>, </code><code>3</code><code>), match</code><code>=</code><code>'abc'</code><code>&gt;    </code><code>##object 比對上了</code>

<code>None</code>   <code>##無比對</code>

<code>abc    </code><code>##  .group比對的内容</code>

比對格式:

^  :  比對字元串的開頭

$  : 比對字元串的結尾

.: 比對任意字元,除了換行符,當re.DOTALL标記被指定時,則可以比對包括換行符的任意字元。

[...]: 用來表示一組字元,單獨列出:[amk] 比對 'a','m''k'

[^...]:不在[]中的字元

re*   比對0個或多個的表達式

re+ 比對1個或多個的表達式

re? 比對0個或1個由前面的正規表達式定義的片段,非貪婪模式

re{n}

re{n,}  精确比對n個前面的表達式

a|b 比對 a  或b

(re)  G比對括号内的表達式,也表示一個組

(?imx)  正規表達式包含三種可選表示  i  m  x  隻影響括号中的區域

(?-imx) 正規表達式關閉  imx

(?:re) 類似(...),但是不表示一個組

(?imx:re)   在括号中使用imx    可選标志

(?-imx:re)  在括号中不使用imx 可選标志

(?#...)注釋。

(?=re)  前向可定界定符

(?!re) 前向福鼎界定符

(?&gt;re) 比對的獨立模式。

\w    比對字母數字    [A-Za-z0-9_]

\W   非字母資料       [^A-Za-z0-9]

\s   任意空白字元    [\f\n\r\t\v]

\S   非任意空白字元  [^\f\n\r\t\v]

\d   任意數字  [0-9]

\D    任意非數字 [^0-9]

\A  字元串開始

\Z   字元串結束,隻比對到換行前的結束字元串

\z    字元串結束  

\G    最後比對完成的位置

\b   一個單詞邊界

\B  非單詞邊界

\n,\t     一個換行符

\1..\9  第n個分組的子表達式

\10   比對第n個分組的子表達式,如果它經比對。否則指的是八進制字元碼的表達式。

10

11

12

13

14

15

<code>re.match(pattern,string)   </code><code>##從頭比對</code>

<code>re.search(pattern,string)   </code><code>##比對整個字元串,直到找到一個比對</code>

<code>re.split()   </code><code>##将比對到的格式當成分割點對字元串分割成清單</code>

<code>re.findall() </code><code>##找到所有要比對的字元并傳回清單格式</code>

<code>re.sub(pattern,repl,string,count,flag)  </code><code>##替換比對到的字元</code>

<code>     </code><code>例子:</code>

<code>&gt;&gt;&gt; m </code><code>=</code> <code>re.split(</code><code>"[0-9]"</code><code>, </code><code>"alex1rain2jack3helen rachel8"</code><code>)</code>

<code>&gt;&gt;&gt; </code><code>print</code><code>(m)</code>

<code>[</code><code>'alex'</code><code>, </code><code>'rain'</code><code>, </code><code>'jack'</code><code>, </code><code>'helen rachel'</code><code>, '']</code>

<code>&gt;&gt;&gt; m </code><code>=</code> <code>re.findall(</code><code>"[0-9]"</code><code>, </code><code>"alex1rain2jack3helen rachel8"</code><code>)</code>

<code>[</code><code>'1'</code><code>, </code><code>'2'</code><code>, </code><code>'3'</code><code>, </code><code>'8'</code><code>]</code>

<code>&gt;&gt;&gt; m</code><code>=</code><code>re.sub(</code><code>"[0-9]"</code><code>,</code><code>"|"</code><code>, </code><code>"alex1rain2jack3helen rachel8"</code><code>,count</code><code>=</code><code>2</code> <code>)</code>

<code>alex|rain|jack3helen rachel8</code>

     備注:

     re.match 與re.search的差別

     re.match隻比對字元串的開始,如果字元串開始不符合正規表達式,則比對失敗。

     re.search比對整個字元串, 直到找到一個比對。

python    比對  python

[Pp]thon         Python   python

rub[ye]            ruby   rube

[aeiou]       括号内的任意一個字母

[0-9]          任何數字

[a-z]           任何小寫字母

[A-Z]          任何大寫字母

[a-zA-Z0-9]    任何字母和數字

[^aeiou]        除了aeiou以外的所有字元

[^0-9]          除了數字外的字元

p = re.compile("^[0-9]")

m = p.match('14534Abc')

差別在于,第一種方式是提前對要比對的格式進行了編譯(對比對公式進行解析),這樣再去比對的時候就不用在編譯比對的格式,第2種簡寫是每次比對的時候 都 要進行一次比對公式的編譯,是以,如果你需要從一個5w行的檔案中比對出所有以數字開頭的行,建議先把正則公式進行編譯再比對,這樣速度會快點。

16

17

18

19

20

21

22

<code>比對手機号</code>

<code>m </code><code>=</code> <code>re.search(</code><code>"(1)([358]\d{9})"</code><code>, phone_str2) </code>

<code>比對IPV4</code>

<code>m </code><code>=</code> <code>re.search(</code><code>"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"</code><code>, ip_addr)</code>

<code>分組比對位址 </code>

<code>contactInfo </code><code>=</code> <code>'Oldboy School, Beijing Changping Shahe: 010-8343245'</code>

<code>match </code><code>=</code> <code>re.search(r</code><code>'(\w+), (\w+): (\S+)'</code><code>, contactInfo) </code><code>#分組</code>

<code>&gt;&gt;&gt; match.group(</code><code>1</code><code>)</code>

<code>  </code><code>'Doe'</code>

<code>  </code><code>&gt;&gt;&gt; match.group(</code><code>2</code><code>)</code>

<code>  </code><code>'John'</code>

<code>  </code><code>&gt;&gt;&gt; match.group(</code><code>3</code><code>)</code>

<code>  </code><code>'555-1212'</code>

<code>match </code><code>=</code> <code>re.search(r</code><code>'(?P&lt;last&gt;\w+), (?P&lt;first&gt;\w+): (?P&lt;phone&gt;\S+)'</code><code>, contactInfo)</code>

<code>&gt;&gt;&gt; match.group(</code><code>'last'</code><code>)</code>

<code>&gt;&gt;&gt; match.group(</code><code>'first'</code><code>)</code>

<code>&gt;&gt;&gt; match.group(</code><code>'phone'</code><code>)</code>

<code>比對email</code>

<code>m </code><code>=</code> <code>re.search(r</code><code>"[0-9.a-z]{1,26}@[0-9.a-z]{1,20}.[0-9a-z]{0,8}.[0-9a-z]{0,8}"</code><code>, email)  </code><code>##r不轉意</code>

<code></code>

将不規則的數組按照從小到大的順序進行排序

<code>data </code><code>=</code> <code>[</code><code>10</code><code>,</code><code>4</code><code>,</code><code>33</code><code>,</code><code>21</code><code>,</code><code>54</code><code>,</code><code>3</code><code>,</code><code>8</code><code>,</code><code>11</code><code>,</code><code>5</code><code>,</code><code>22</code><code>,</code><code>2</code><code>,</code><code>1</code><code>,</code><code>17</code><code>,</code><code>13</code><code>,</code><code>6</code><code>]</code>

<code>for</code> <code>j </code><code>in</code> <code>range</code><code>(</code><code>1</code><code>,</code><code>len</code><code>(data)):      </code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>len</code><code>(data)</code><code>-</code><code>j):   </code><code>##-j 是因為第一次排序54,已經到最後了,不用排序了。第二次33到最後了,不用比較了。依次隻比較前面的數組。</code>

<code>        </code><code>if</code> <code>data[i] &gt;  data[i</code><code>+</code><code>1</code><code>]:  </code><code>## 10,4進行比較</code>

<code>            </code><code>tmp </code><code>=</code> <code>data[i</code><code>+</code><code>1</code><code>]        </code><code>##tmp=4</code>

<code>            </code><code>data[i</code><code>+</code><code>1</code><code>] </code><code>=</code> <code>data[i]    </code><code>##4變10</code>

<code>            </code><code>data[i] </code><code>=</code> <code>tmp          </code><code>##10變成4 </code>

<code>print</code><code>(data)</code>

結果

[4, 10, 21, 33, 3, 8, 11, 5, 22, 2, 1, 17, 13, 6, 54]

[4, 10, 21, 3, 8, 11, 5, 22, 2, 1, 17, 13, 6, 33, 54]

[4, 10, 3, 8, 11, 5, 21, 2, 1, 17, 13, 6, 22, 33, 54]

[4, 3, 8, 10, 5, 11, 2, 1, 17, 13, 6, 21, 22, 33, 54]

[3, 4, 8, 5, 10, 2, 1, 11, 13, 6, 17, 21, 22, 33, 54]

[3, 4, 5, 8, 2, 1, 10, 11, 6, 13, 17, 21, 22, 33, 54]

[3, 4, 5, 2, 1, 8, 10, 6, 11, 13, 17, 21, 22, 33, 54]

[3, 4, 2, 1, 5, 8, 6, 10, 11, 13, 17, 21, 22, 33, 54]

[3, 2, 1, 4, 5, 6, 8, 10, 11, 13, 17, 21, 22, 33, 54]

[2, 1, 3, 4, 5, 6, 8, 10, 11, 13, 17, 21, 22, 33, 54]

[1, 2, 3, 4, 5, 6, 8, 10, 11, 13, 17, 21, 22, 33, 54]

時間複雜度 

(1)時間頻度 一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運作測試才能知道。但我們不可能也沒有必要對每個算法都上機測試,隻需知道哪個算法花費的時間多,哪個算法花費的時間少就可以了。并且一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。

(2)時間複雜度 在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。 一般情況下,算法中基本操作重複執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間複雜度,簡稱時間複雜度。

指數時間

<code>for</code> <code>(i=</code><code>1</code><code>; i&lt;=n; i++)</code>

<code>       </code><code>x++;</code>

<code>    </code><code> </code><code>for</code> <code>(j=</code><code>1</code><code>; j&lt;=n; j++)</code>

<code>          </code><code>x++;</code>

第一個for循環的時間複雜度為Ο(n),第二個for循環的時間複雜度為Ο(n2),則整個算法的時間複雜度為Ο(n+n2)=Ο(n2)。

常數時間

對數時間 

若算法的T(n) = O(log n),則稱其具有對數時間

對數時間的算法是非常有效的,因為每增加一個輸入,其所需要的額外計算時間會變小。

遞歸地将字元串砍半并且輸出是這個類别函數的一個簡單例子。它需要O(log n)的時間因為每次輸出之前我們都将字元串砍半。 這意味着,如果我們想增加輸出的次數,我們需要将字元串長度加倍。

線性時間 

如果一個算法的時間複雜度為O(n),則稱這個算法具有線性時間,或O(n)時間。非正式地說,這意味着對于足夠大的輸入,運作時間增加的大小與輸入成線性關系。例如,一個計算清單所有元素的和的程式,需要的時間與清單的長度成正比。

本文轉自 295631788 51CTO部落格,原文連結:http://blog.51cto.com/hequan/1886449,如需轉載請自行聯系原作者