python 高級(jí)教程

!/usr/bin/python

-- coding: UTF-8 --

class Employee:
'所有員工的基類'
empCount = 0

def init(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1

def displayCount(self):
print "Total Employee %d" % Employee.empCount

def displayEmployee(self):
print "Name : ", self.name, ", Salary: ", self.salary

!/usr/bin/python

-- coding: UTF-8 --

class Employee:
'所有員工的基類'
empCount = 0

def init(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1

def displayCount(self):
print "Total Employee %d" % Employee.empCount

def displayEmployee(self):
print "Name : ", self.name, ", Salary: ", self.salary

"創(chuàng)建 Employee 類的第一個(gè)對(duì)象"
emp1 = Employee("Zara", 2000)
"創(chuàng)建 Employee 類的第二個(gè)對(duì)象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

正則表達(dá)式

Python 正則表達(dá)式

正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配。

Python 自1.5版本起增加了re 模塊,它提供 Perl 風(fēng)格的正則表達(dá)式模式。

re 模塊使 Python 語(yǔ)言擁有全部的正則表達(dá)式功能。

compile 函數(shù)根據(jù)一個(gè)模式字符串和可選的標(biāo)志參數(shù)生成一個(gè)正則表達(dá)式對(duì)象。該對(duì)象擁有一系列方法用于正則表達(dá)式匹配和替換。

re 模塊也提供了與這些方法功能完全一致的函數(shù),這些函數(shù)使用一個(gè)模式字符串做為它們的第一個(gè)參數(shù)。

本章節(jié)主要介紹Python中常用的正則表達(dá)式處理函數(shù)。


re.match函數(shù)

re.match 嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match()就返回none。

函數(shù)語(yǔ)法

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">re.match(pattern, string, flags=0)</pre>

函數(shù)參數(shù)說(shuō)明:

| 參數(shù) | 描述 |
| pattern | 匹配的正則表達(dá)式 |
| string | 要匹配的字符串。 |
| flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫(xiě),多行匹配等等。參見(jiàn):正則表達(dá)式修飾符 - 可選標(biāo)志 |

匹配成功re.match方法返回一個(gè)匹配的對(duì)象,否則返回None。

我們可以使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。

| 匹配對(duì)象方法 | 描述 |
| group(num=0) | 匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號(hào),在這種情況下它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組。 |
| groups() | 返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號(hào)。 |

實(shí)例

!/usr/bin/python # -- coding: UTF-8 -- import re print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配

以上實(shí)例運(yùn)行輸出結(jié)果為:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">(0, 3) None</pre>

實(shí)例

!/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match( r'(.) are (.?) .*', line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!"

以上實(shí)例執(zhí)行結(jié)果如下:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats matchObj.group(2) : smarter</pre>


re.search方法

re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配。

函數(shù)語(yǔ)法:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">re.search(pattern, string, flags=0)</pre>

函數(shù)參數(shù)說(shuō)明:

| 參數(shù) | 描述 |
| pattern | 匹配的正則表達(dá)式 |
| string | 要匹配的字符串。 |
| flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫(xiě),多行匹配等等。 |

匹配成功re.search方法返回一個(gè)匹配的對(duì)象,否則返回None。

我們可以使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。

| 匹配對(duì)象方法 | 描述 |
| group(num=0) | 匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號(hào),在這種情況下它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組。 |
| groups() | 返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號(hào)。 |

實(shí)例

!/usr/bin/python # -- coding: UTF-8 -- import re print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配

以上實(shí)例運(yùn)行輸出結(jié)果為:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">(0, 3) (11, 14)</pre>

實(shí)例

!/usr/bin/python import re line = "Cats are smarter than dogs"; searchObj = re.search( r'(.) are (.?) .*', line, re.M|re.I) if searchObj: print "searchObj.group() : ", searchObj.group() print "searchObj.group(1) : ", searchObj.group(1) print "searchObj.group(2) : ", searchObj.group(2) else: print "Nothing found!!"

以上實(shí)例執(zhí)行結(jié)果如下:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats searchObj.group(2) : smarter</pre>


re.match與re.search的區(qū)別

re.match只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個(gè)字符串,直到找到一個(gè)匹配。

實(shí)例

!/usr/bin/python import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print "match --> matchObj.group() : ", matchObj.group() else: print "No match!!" matchObj = re.search( r'dogs', line, re.M|re.I) if matchObj: print "search --> matchObj.group() : ", matchObj.group() else: print "No match!!"

以上實(shí)例運(yùn)行結(jié)果如下:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">No match!! search --> matchObj.group() : dogs</pre>


檢索和替換

Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項(xiàng)。

語(yǔ)法:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">re.sub(pattern, repl, string, count=0, flags=0)</pre>

參數(shù):

  • pattern : 正則中的模式字符串。
  • repl : 替換的字符串,也可為一個(gè)函數(shù)。
  • string : 要被查找替換的原始字符串。
  • count : 模式匹配后替換的最大次數(shù),默認(rèn) 0 表示替換所有的匹配。

實(shí)例

!/usr/bin/python # -- coding: UTF-8 -- import re phone = "2004-959-559 # 這是一個(gè)國(guó)外電話號(hào)碼" # 刪除字符串中的 Python注釋 num = re.sub(r'#.*$', "", phone) print "電話號(hào)碼是: ", num # 刪除非數(shù)字(-)的字符串 num = re.sub(r'\D', "", phone) print "電話號(hào)碼是 : ", num

以上實(shí)例執(zhí)行結(jié)果如下:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">電話號(hào)碼是: 2004-959-559 電話號(hào)碼是 : 2004959559</pre>

repl 參數(shù)是一個(gè)函數(shù)

以下實(shí)例中將字符串中的匹配的數(shù)字乘以 2:

實(shí)例

!/usr/bin/python # -- coding: UTF-8 -- import re # 將匹配的數(shù)字乘以 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))

執(zhí)行輸出結(jié)果為:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">A46G8HFD1134</pre>

re.compile 函數(shù)

compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式( Pattern )對(duì)象,供 match() 和 search() 這兩個(gè)函數(shù)使用。

語(yǔ)法格式為:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">re.compile(pattern[, flags])</pre>

參數(shù):

  • pattern : 一個(gè)字符串形式的正則表達(dá)式

  • flags : 可選,表示匹配模式,比如忽略大小寫(xiě),多行模式等,具體參數(shù)為:

    1. re.I 忽略大小寫(xiě)
    2. re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境
    3. re.M 多行模式
    4. re.S 即為 . 并且包括換行符在內(nèi)的任意字符(. 不包括換行符)
    5. re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫(kù)
    6. re.X 為了增加可讀性,忽略空格和 # 后面的注釋

實(shí)例

實(shí)例

import re >>> pattern = re.compile(r'\d+') # 用于匹配至少一個(gè)數(shù)字 >>> m = pattern.match('one12twothree34four') # 查找頭部,沒(méi)有匹配 >>> print m None >>> m = pattern.match('one12twothree34four', 2, 10) # 從'e'的位置開(kāi)始匹配,沒(méi)有匹配 >>> print m None >>> m = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開(kāi)始匹配,正好匹配 >>> print m # 返回一個(gè) Match 對(duì)象 <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # 可省略 0 '12' >>> m.start(0) # 可省略 0 3 >>> m.end(0) # 可省略 0 5 >>> m.span(0) # 可省略 0 (3, 5)

在上面,當(dāng)匹配成功時(shí)返回一個(gè) Match 對(duì)象,其中:

  • group([group1, …]) 方法用于獲得一個(gè)或多個(gè)分組匹配的字符串,當(dāng)要獲得整個(gè)匹配的子串時(shí),可直接使用 group()group(0)
  • start([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的起始位置(子串第一個(gè)字符的索引),參數(shù)默認(rèn)值為 0;
  • end([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的結(jié)束位置(子串最后一個(gè)字符的索引+1),參數(shù)默認(rèn)值為 0;
  • span([group]) 方法返回 (start(group), end(group))

再看看一個(gè)例子:

實(shí)例

import re >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小寫(xiě) >>> m = pattern.match('Hello World Wide Web') >>> print m # 匹配成功,返回一個(gè) Match 對(duì)象 <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # 返回匹配成功的整個(gè)子串 'Hello World' >>> m.span(0) # 返回匹配成功的整個(gè)子串的索引 (0, 11) >>> m.group(1) # 返回第一個(gè)分組匹配成功的子串 'Hello' >>> m.span(1) # 返回第一個(gè)分組匹配成功的子串的索引 (0, 5) >>> m.group(2) # 返回第二個(gè)分組匹配成功的子串 'World' >>> m.span(2) # 返回第二個(gè)分組匹配成功的子串 (6, 11) >>> m.groups() # 等價(jià)于 (m.group(1), m.group(2), ...) ('Hello', 'World') >>> m.group(3) # 不存在第三個(gè)分組 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: no such group

findall

在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果沒(méi)有找到匹配的,則返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

語(yǔ)法格式為:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">findall(string[, pos[, endpos]])</pre>

參數(shù):

  • string : 待匹配的字符串。
  • pos : 可選參數(shù),指定字符串的起始位置,默認(rèn)為 0。
  • endpos : 可選參數(shù),指定字符串的結(jié)束位置,默認(rèn)為字符串的長(zhǎng)度。

查找字符串中的所有數(shù)字:

實(shí)例

-- coding:UTF8 -- import re pattern = re.compile(r'\d+') # 查找數(shù)字 result1 = pattern.findall('runoob 123 google 456') result2 = pattern.findall('run88oob123google456', 0, 10) print(result1) print(result2)

輸出結(jié)果:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">['123', '456'] ['88', '12']</pre>

re.finditer

和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回。

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">re.finditer(pattern, string, flags=0)</pre>

參數(shù):

| 參數(shù) | 描述 |
| pattern | 匹配的正則表達(dá)式 |
| string | 要匹配的字符串。 |
| flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫(xiě),多行匹配等等。參見(jiàn):正則表達(dá)式修飾符 - 可選標(biāo)志 |

實(shí)例

-- coding: UTF-8 -- import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() )

輸出結(jié)果:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">12 32 43 3</pre>

re.split

split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:

<pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px auto; padding: 10px 15px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251);">re.split(pattern, string[, maxsplit=0, flags=0])</pre>

參數(shù):

| 參數(shù) | 描述 |
| pattern | 匹配的正則表達(dá)式 |
| string | 要匹配的字符串。 |
| maxsplit | 分隔次數(shù),maxsplit=1 分隔一次,默認(rèn)為 0,不限制次數(shù)。 |
| flags | 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫(xiě),多行匹配等等。參見(jiàn):正則表達(dá)式修飾符 - 可選標(biāo)志 |

實(shí)例

import re >>> re.split('\W+', 'runoob, runoob, runoob.') ['runoob', 'runoob', 'runoob', ''] >>> re.split('(\W+)', ' runoob, runoob, runoob.') ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', ''] >>> re.split('\W+', ' runoob, runoob, runoob.', 1) ['', 'runoob, runoob, runoob.'] >>> re.split('a*', 'hello world') # 對(duì)于一個(gè)找不到匹配的字符串而言,split 不會(huì)對(duì)其作出分割 ['hello world']


正則表達(dá)式對(duì)象

re.RegexObject

re.compile() 返回 RegexObject 對(duì)象。

re.MatchObject

group() 返回被 RE 匹配的字符串。

  • start() 返回匹配開(kāi)始的位置
  • end() 返回匹配結(jié)束的位置
  • span() 返回一個(gè)元組包含匹配 (開(kāi)始,結(jié)束) 的位置

正則表達(dá)式修飾符 - 可選標(biāo)志

正則表達(dá)式可以包含一些可選標(biāo)志修飾符來(lái)控制匹配的模式。修飾符被指定為一個(gè)可選的標(biāo)志。多個(gè)標(biāo)志可以通過(guò)按位 OR(|) 它們來(lái)指定。如 re.I | re.M 被設(shè)置成 I 和 M 標(biāo)志:

| 修飾符 | 描述 |
| re.I | 使匹配對(duì)大小寫(xiě)不敏感 |
| re.L | 做本地化識(shí)別(locale-aware)匹配 |
| re.M | 多行匹配,影響 ^ 和 $ |
| re.S | 使 . 匹配包括換行在內(nèi)的所有字符 |
| re.U | 根據(jù)Unicode字符集解析字符。這個(gè)標(biāo)志影響 \w, \W, \b, \B. |
| re.X | 該標(biāo)志通過(guò)給予你更靈活的格式以便你將正則表達(dá)式寫(xiě)得更易于理解。 |


正則表達(dá)式模式

模式字符串使用特殊的語(yǔ)法來(lái)表示一個(gè)正則表達(dá)式:

字母和數(shù)字表示他們自身。一個(gè)正則表達(dá)式模式中的字母和數(shù)字匹配同樣的字符串。

多數(shù)字母和數(shù)字前加一個(gè)反斜杠時(shí)會(huì)擁有不同的含義。

標(biāo)點(diǎn)符號(hào)只有被轉(zhuǎn)義時(shí)才匹配自身,否則它們表示特殊的含義。

反斜杠本身需要使用反斜杠轉(zhuǎn)義。

由于正則表達(dá)式通常都包含反斜杠,所以你最好使用原始字符串來(lái)表示它們。模式元素(如 r'\t',等價(jià)于 '\t')匹配相應(yīng)的特殊字符。

下表列出了正則表達(dá)式模式語(yǔ)法中的特殊元素。如果你使用模式的同時(shí)提供了可選的標(biāo)志參數(shù),某些模式元素的含義會(huì)改變。

| 模式 | 描述 |
| ^ | 匹配字符串的開(kāi)頭 |
| $ | 匹配字符串的末尾。 |
| . | 匹配任意字符,除了換行符,當(dāng)re.DOTALL標(biāo)記被指定時(shí),則可以匹配包括換行符的任意字符。 |
| [...] | 用來(lái)表示一組字符,單獨(dú)列出:[amk] 匹配 'a','m'或'k' |
| [^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
| re* | 匹配0個(gè)或多個(gè)的表達(dá)式。 |
| re+ | 匹配1個(gè)或多個(gè)的表達(dá)式。 |
| re? | 匹配0個(gè)或1個(gè)由前面的正則表達(dá)式定義的片段,非貪婪方式 |
| re{ n} | 精確匹配 n 個(gè)前面表達(dá)式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的兩個(gè) o。 |
| re{ n,} | 匹配 n 個(gè)前面表達(dá)式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等價(jià)于 "o+"。"o{0,}" 則等價(jià)于 "o*"。 |
| re{ n, m} | 匹配 n 到 m 次由前面的正則表達(dá)式定義的片段,貪婪方式 |
| a| b | 匹配a或b |
| (re) | 匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組 |
| (?imx) | 正則表達(dá)式包含三種可選標(biāo)志:i, m, 或 x 。只影響括號(hào)中的區(qū)域。 |
| (?-imx) | 正則表達(dá)式關(guān)閉 i, m, 或 x 可選標(biāo)志。只影響括號(hào)中的區(qū)域。 |
| (?: re) | 類似 (...), 但是不表示一個(gè)組 |
| (?imx: re) | 在括號(hào)中使用i, m, 或 x 可選標(biāo)志 |
| (?-imx: re) | 在括號(hào)中不使用i, m, 或 x 可選標(biāo)志 |
| (?#...) | 注釋. |
| (?= re) | 前向肯定界定符。如果所含正則表達(dá)式,以 ... 表示,在當(dāng)前位置成功匹配時(shí)成功,否則失敗。但一旦所含表達(dá)式已經(jīng)嘗試,匹配引擎根本沒(méi)有提高;模式的剩余部分還要嘗試界定符的右邊。 |
| (?! re) | 前向否定界定符。與肯定界定符相反;當(dāng)所含表達(dá)式不能在字符串當(dāng)前位置匹配時(shí)成功 |
| (?> re) | 匹配的獨(dú)立模式,省去回溯。 |
| \w | 匹配字母數(shù)字及下劃線 |
| \W | 匹配非字母數(shù)字及下劃線 |
| \s | 匹配任意空白字符,等價(jià)于 [\t\n\r\f]. |
| \S | 匹配任意非空字符 |
| \d | 匹配任意數(shù)字,等價(jià)于 [0-9]. |
| \D | 匹配任意非數(shù)字 |
| \A | 匹配字符串開(kāi)始 |
| \Z | 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串。 |
| \z | 匹配字符串結(jié)束 |
| \G | 匹配最后匹配完成的位置。 |
| \b | 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
| \B | 匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
| \n, \t, 等. | 匹配一個(gè)換行符。匹配一個(gè)制表符。等 |
| \1...\9 | 匹配第n個(gè)分組的內(nèi)容。 |
| \10 | 匹配第n個(gè)分組的內(nèi)容,如果它經(jīng)匹配。否則指的是八進(jìn)制字符碼的表達(dá)式。 |


正則表達(dá)式實(shí)例

字符匹配

| 實(shí)例 | 描述 |
| python | 匹配 "python". |

字符類

| 實(shí)例 | 描述 |
| [Pp]ython | 匹配 "Python" 或 "python" |
| rub[ye] | 匹配 "ruby" 或 "rube" |
| [aeiou] | 匹配中括號(hào)內(nèi)的任意一個(gè)字母 |
| [0-9] | 匹配任何數(shù)字。類似于 [0123456789] |
| [a-z] | 匹配任何小寫(xiě)字母 |
| [A-Z] | 匹配任何大寫(xiě)字母 |
| [a-zA-Z0-9] | 匹配任何字母及數(shù)字 |
| [^aeiou] | 除了aeiou字母以外的所有字符 |
| [^0-9] | 匹配除了數(shù)字外的字符 |

特殊字符類

| 實(shí)例 | 描述 |
| . | 匹配除 "\n" 之外的任何單個(gè)字符。要匹配包括 '\n' 在內(nèi)的任何字符,請(qǐng)使用象 '[.\n]' 的模式。 |
| \d | 匹配一個(gè)數(shù)字字符。等價(jià)于 [0-9]。 |
| \D | 匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]。 |
| \s | 匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]。 |
| \S | 匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。 |
| \w | 匹配包括下劃線的任何單詞字符。等價(jià)于'[A-Za-z0-9_]'。 |
| \W | 匹配任何非單詞字符。等價(jià)于 '[^A-Za-z0-9_]'。 |

Python 面向?qū)ο?/a>

Python CGI編程

2 篇筆記

  1. jim

    264***7522@qq.com

    正則表達(dá)式實(shí)例:

    <pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 3px 0px 5px; padding: 7px 10px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251); border-radius: 1px;">#!/usr/bin/python import re
    line = "Cats are smarter than dogs" matchObj = re.match( r'(.) are (.?) .*', line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!"</pre>

    正則表達(dá)式:

    <pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 3px 0px 5px; padding: 7px 10px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251); border-radius: 1px;">r'(.) are (.?) .*'</pre>

    解析:

    首先,這是一個(gè)字符串,前面的一個(gè) r 表示字符串為非轉(zhuǎn)義的原始字符串,讓編譯器忽略反斜杠,也就是忽略轉(zhuǎn)義字符。但是這個(gè)字符串里沒(méi)有反斜杠,所以這個(gè) r 可有可無(wú)。

    • (.)* 第一個(gè)匹配分組,.* 代表匹配除換行符之外的所有字符。
    • (.?)* 第二個(gè)匹配分組,.*? 后面多個(gè)問(wèn)號(hào),代表非貪婪模式,也就是說(shuō)只匹配符合條件的最少字符
    • 后面的一個(gè) .* 沒(méi)有括號(hào)包圍,所以不是分組,匹配效果和第一個(gè)一樣,但是不計(jì)入匹配結(jié)果中。

    matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符

    matchObj.group(1) 得到第一組匹配結(jié)果,也就是(.*)匹配到的

    matchObj.group(2) 得到第二組匹配結(jié)果,也就是(.*?)匹配到的

    因?yàn)橹挥衅ヅ浣Y(jié)果中只有兩組,所以如果填 3 時(shí)會(huì)報(bào)錯(cuò)。

    [jim](javascript:;)

    jim

    264***7522@qq.com 1年前 (2017-04-24)

  2. CrazyDemo

    444***899@qq.com

    '(?P<name>...)'</name> 分組匹配

    例:身份證 1102231990xxxxxxxx

    <pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 3px 0px 5px; padding: 7px 10px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251); border-radius: 1px;">import re
    s = '1102231990xxxxxxxx' res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{3})',s) print(res.groupdict())</pre>

    此分組取出結(jié)果為:

    <pre class="prettyprint prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 3px 0px 5px; padding: 7px 10px; font: 12px/20px Menlo, Monaco, Consolas, "Andale Mono", "lucida console", "Courier New", monospace; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/images/codecolorer_bg.gif") center top rgb(251, 251, 251); border-radius: 1px;">{'province': '110', 'city': '223', 'born_year': '199'}</pre>

    直接將匹配結(jié)果直接轉(zhuǎn)為字典模式,方便使用。

python cgi編程

獲取mysql版本號(hào)

!/usr/bin/python

-- coding: UTF-8 --

import MySQLdb

打開(kāi)數(shù)據(jù)庫(kù)連接

db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )

使用cursor()方法獲取操作游標(biāo)

cursor = db.cursor()

使用execute方法執(zhí)行SQL語(yǔ)句

cursor.execute("SELECT VERSION()")

使用 fetchone() 方法獲取一條數(shù)據(jù)

data = cursor.fetchone()

print "Database version : %s " % data

關(guān)閉數(shù)據(jù)庫(kù)連接

db.close()

創(chuàng)建數(shù)據(jù)庫(kù)表:

!/usr/bin/python

-- coding: UTF-8 --

import MySQLdb

打開(kāi)數(shù)據(jù)庫(kù)連接

db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )

使用cursor()方法獲取操作游標(biāo)

cursor = db.cursor()

如果數(shù)據(jù)表已經(jīng)存在使用 execute() 方法刪除表。

cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

創(chuàng)建數(shù)據(jù)表SQL語(yǔ)句

sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""

cursor.execute(sql)

關(guān)閉數(shù)據(jù)庫(kù)連接

db.close()

數(shù)據(jù)庫(kù)插入語(yǔ)句

!/usr/bin/python

-- coding: UTF-8 --

import MySQLdb

打開(kāi)數(shù)據(jù)庫(kù)連接

db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )

使用cursor()方法獲取操作游標(biāo)

cursor = db.cursor()

SQL 插入語(yǔ)句

sql = "INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('%s', '%s', '%d', '%c', '%d' )" %
('Mac', 'Mohan', 20, 'M', 2000)
try:

執(zhí)行sql語(yǔ)句

cursor.execute(sql)

提交到數(shù)據(jù)庫(kù)執(zhí)行

db.commit()
except:

發(fā)生錯(cuò)誤時(shí)回滾

db.rollback()

關(guān)閉數(shù)據(jù)庫(kù)連接

db.close()

數(shù)據(jù)庫(kù)查詢

!/usr/bin/python

-- coding: UTF-8 --

import MySQLdb

打開(kāi)數(shù)據(jù)庫(kù)連接

db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )

使用cursor()方法獲取操作游標(biāo)

cursor = db.cursor()

SQL 查詢語(yǔ)句

sql = "SELECT * FROM EMPLOYEE
WHERE INCOME > '%d'" % (1000)
try:

執(zhí)行SQL語(yǔ)句

cursor.execute(sql)

獲取所有記錄列表

results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印結(jié)果
print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" %
(fname, lname, age, sex, income )
except:
print "Error: unable to fecth data"

關(guān)閉數(shù)據(jù)庫(kù)連接

db.close()

python 網(wǎng)絡(luò)編程


image.png

發(fā)送郵件

!/usr/bin/python

-- coding: UTF-8 --

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@runoob.com'
receivers = ['429240967@qq.com'] # 接收郵件,可設(shè)置為你的QQ郵箱或者其他郵箱

三個(gè)參數(shù):第一個(gè)為文本內(nèi)容,第二個(gè) plain 設(shè)置文本格式,第三個(gè) utf-8 設(shè)置編碼

message = MIMEText('Python 郵件發(fā)送測(cè)試...', 'plain', 'utf-8')
message['From'] = Header("菜鳥(niǎo)教程", 'utf-8') # 發(fā)送者
message['To'] = Header("測(cè)試", 'utf-8') # 接收者

subject = 'Python SMTP 郵件測(cè)試'
message['Subject'] = Header(subject, 'utf-8')

try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print "郵件發(fā)送成功"
except smtplib.SMTPException:
print "Error: 無(wú)法發(fā)送郵件"

發(fā)送郵件:

!/usr/bin/python

-- coding: UTF-8 --

import smtplib
from email.mime.text import MIMEText
from email.header import Header

第三方 SMTP 服務(wù)

mail_host="smtp.XXX.com" #設(shè)置服務(wù)器
mail_user="XXXX" #用戶名
mail_pass="XXXXXX" #口令

sender = 'from@runoob.com'
receivers = ['429240967@qq.com'] # 接收郵件,可設(shè)置為你的QQ郵箱或者其他郵箱

message = MIMEText('Python 郵件發(fā)送測(cè)試...', 'plain', 'utf-8')
message['From'] = Header("菜鳥(niǎo)教程", 'utf-8')
message['To'] = Header("測(cè)試", 'utf-8')

subject = 'Python SMTP 郵件測(cè)試'
message['Subject'] = Header(subject, 'utf-8')

try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 為 SMTP 端口號(hào)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print "郵件發(fā)送成功"
except smtplib.SMTPException:
print "Error: 無(wú)法發(fā)送郵件"

發(fā)送HTML格式的郵件

!/usr/bin/python

-- coding: UTF-8 --

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@runoob.com'
receivers = ['429240967@qq.com'] # 接收郵件,可設(shè)置為你的QQ郵箱或者其他郵箱

mail_msg = """
<p>Python 郵件發(fā)送測(cè)試...</p>
<p><a >這是一個(gè)鏈接</a></p>
"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("菜鳥(niǎo)教程", 'utf-8')
message['To'] = Header("測(cè)試", 'utf-8')

subject = 'Python SMTP 郵件測(cè)試'
message['Subject'] = Header(subject, 'utf-8')

try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print "郵件發(fā)送成功"
except smtplib.SMTPException:
print "Error: 無(wú)法發(fā)送郵件"

發(fā)送帶附件的郵件:

!/usr/bin/python

-- coding: UTF-8 --

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

sender = 'from@runoob.com'
receivers = ['429240967@qq.com'] # 接收郵件,可設(shè)置為你的QQ郵箱或者其他郵箱

創(chuàng)建一個(gè)帶附件的實(shí)例

message = MIMEMultipart()
message['From'] = Header("菜鳥(niǎo)教程", 'utf-8')
message['To'] = Header("測(cè)試", 'utf-8')
subject = 'Python SMTP 郵件測(cè)試'
message['Subject'] = Header(subject, 'utf-8')

郵件正文內(nèi)容

message.attach(MIMEText('這是菜鳥(niǎo)教程Python 郵件發(fā)送測(cè)試……', 'plain', 'utf-8'))

構(gòu)造附件1,傳送當(dāng)前目錄下的 test.txt 文件

att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'

這里的filename可以任意寫(xiě),寫(xiě)什么名字,郵件中顯示什么名字

att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)

構(gòu)造附件2,傳送當(dāng)前目錄下的 runoob.txt 文件

att2 = MIMEText(open('runoob.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="runoob.txt"'
message.attach(att2)

try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print "郵件發(fā)送成功"
except smtplib.SMTPException:
print "Error: 無(wú)法發(fā)送郵件"

在HTML中添加圖片

!/usr/bin/python

-- coding: UTF-8 --

import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@runoob.com'
receivers = ['429240967@qq.com'] # 接收郵件,可設(shè)置為你的QQ郵箱或者其他郵箱

msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("菜鳥(niǎo)教程", 'utf-8')
msgRoot['To'] = Header("測(cè)試", 'utf-8')
subject = 'Python SMTP 郵件測(cè)試'
msgRoot['Subject'] = Header(subject, 'utf-8')

msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)

mail_msg = """
<p>Python 郵件發(fā)送測(cè)試...</p>
<p><a >菜鳥(niǎo)教程鏈接</a></p>
<p>圖片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))

指定圖片為當(dāng)前目錄

fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

定義圖片 ID,在 HTML 文本中引用

msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)

try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, msgRoot.as_string())
print "郵件發(fā)送成功"
except smtplib.SMTPException:
print "Error: 無(wú)法發(fā)送郵件"

發(fā)送QQ郵件:

!/usr/bin/python

-- coding: UTF-8 --

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

my_sender='429240967@qq.com' # 發(fā)件人郵箱賬號(hào)
my_pass = 'xxxxxxxxxx' # 發(fā)件人郵箱密碼
my_user='429240967@qq.com' # 收件人郵箱賬號(hào),我這邊發(fā)送給自己
def mail():
ret=True
try:
msg=MIMEText('填寫(xiě)郵件內(nèi)容','plain','utf-8')
msg['From']=formataddr(["FromRunoob",my_sender]) # 括號(hào)里的對(duì)應(yīng)發(fā)件人郵箱昵稱、發(fā)件人郵箱賬號(hào)
msg['To']=formataddr(["FK",my_user]) # 括號(hào)里的對(duì)應(yīng)收件人郵箱昵稱、收件人郵箱賬號(hào)
msg['Subject']="菜鳥(niǎo)教程發(fā)送郵件測(cè)試" # 郵件的主題,也可以說(shuō)是標(biāo)題

    server=smtplib.SMTP_SSL("smtp.qq.com", 465)  # 發(fā)件人郵箱中的SMTP服務(wù)器,端口是25
    server.login(my_sender, my_pass)  # 括號(hào)中對(duì)應(yīng)的是發(fā)件人郵箱賬號(hào)、郵箱密碼
    server.sendmail(my_sender,[my_user,],msg.as_string())  # 括號(hào)中對(duì)應(yīng)的是發(fā)件人郵箱賬號(hào)、收件人郵箱賬號(hào)、發(fā)送郵件
    server.quit()  # 關(guān)閉連接
except Exception:  # 如果 try 中的語(yǔ)句沒(méi)有執(zhí)行,則會(huì)執(zhí)行下面的 ret=False
    ret=False
return ret

ret=mail()
if ret:
print("郵件發(fā)送成功")
else:
print("郵件發(fā)送失敗")

thread.start_new_thread

!/usr/bin/python

-- coding: UTF-8 --

import thread
import time

為線程定義一個(gè)函數(shù)

def print_time( threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print "%s: %s" % ( threadName, time.ctime(time.time()) )

創(chuàng)建兩個(gè)線程

try:
thread.start_new_thread( print_time, ("Thread-1", 2, ) )
thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
print "Error: unable to start thread"

while 1:
pass

xml解析
tkinter

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,673評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,610評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,939評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,668評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,004評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,173評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,705評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,426評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,656評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,833評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,247評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,580評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,371評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,621評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容