Python的正規表示式

2021-06-22 12:07:47 字數 3436 閱讀 5246

這篇文章使用 markdown 寫成。

python的正規表示式是使用re 模組的。

match = re.search(pattern,str)

if match:

print 'found',match.group()

else:

print 'not found!'

## 在字串'piiig'中查詢'iii'

match = re.search(r'iii', 'piiig') => found, match.group() == "iii"

match = re.search(r'igs', 'piiig') => not found, match == none

## . 匹配除了\n的任意字元

match = re.search(r'..g', 'piiig') => found, match.group() == "iig"

## \d 匹配0-9的數字字元, \w 匹配單詞裡的字元

match = re.search(r'\d\d\d', 'p123g') => found, match.group() == "123"

match = re.search(r'\w\w\w', '@@abcd!!') => found, match.group() == "abc"

可以用'+' '*' '?'來匹配0個,1個或多個重複字元。

注意,'+'和'*'會匹配盡可能多的字元。

## i+  匹配1個或者多個'i'

match = re.search(r'pi+', 'piiig') => found, match.group() == "piii"

## 找到字串中最左邊盡可能長的模式。

## 注意,並沒有匹配到第二個 'i+'

match = re.search(r'i+', 'piigiiii') => found, match.group() == "ii"

## \s* 匹配0個或1個空白字元 whitespace

match = re.search(r'\d\s*\d\s*\d', 'xx1 2 3xx') => found, match.group() == "1 2 3"

match = re.search(r'\d\s*\d\s*\d', 'xx12 3xx') => found, match.group() == "12 3"

match = re.search(r'\d\s*\d\s*\d', 'xx123xx') => found, match.group() == "123"

## ^ 匹配字串的第乙個字元

match = re.search(r'^b\w+', 'foobar') => not found, match == none

## 與上例對比

match = re.search(r'b\w+', 'foobar') => found, match.group() == "bar"

match = re.search(r'\w+@\w+',str)
但是,對於這種email位址 'xyz [email protected] purple monkey' 則不能奏效。

方括號裡面的字元表示乙個字元集合。[abc]可以被用來匹配'a'或者'b'或者'c'。\w \s等都可以用在方括號裡,除了'.'以外,它只能用來表示字面意義上的『點』。所以上面的email規則可以擴充如下:

match = re.search('r[\w.-]+@[\w.-]+',str)
你還可以使用'-'來指定範圍,如[a-z]指示的是所有小寫字母的集合。所以如果你想構造的字元集合中有'-',請把它放到末尾[ab-]。另外,前方加上'^',用來表示取集合的補集,例如[^ab]表示除了'a'和'b'之外的其他字元。

以email位址為例,如果我們想要分別提取該位址的使用者名稱'someone'和主機名'host.com'該怎麼辦呢?可以在模式中用圓括號指定。

str = 'purple [email protected] monkey dishwasher'

match = re.search('([\w.-]+)@([\w.-]+)', str) #用圓括號指定分割

if match:

print match.group() ## '[email protected]' (the whole match)

print match.group(1) ## 'alice-b' (the username, group 1)

print match.group(2) ## 'google.com' (the host, group 2)

與group函式只找到最左端的乙個匹配不同,findall函式找到字串中所有與模式匹配的串。

str = 'purple [email protected], blah monkey [email protected] blah dishwasher'

## findall返回乙個包含所有匹配結果的 list

emails = re.findall(r'[\w\.-]+@[\w\.-]+', str) ## ['[email protected]', '[email protected]']

for email in emails:

print email

當然可以讀入檔案的每一行,然後對每一行的內容呼叫findall,但是為什麼讓這一切自動發生呢?

f = open(filename.txt,'r')

matches = re.findall(pattern,f.read())

和group的用法相似,也可以指定分組。

str = 'purple [email protected], blah monkey [email protected] blah dishwasher'

## 返回了乙個list

tuples = re.findall(r'([\w\.-]+)@([\w\.-]+)', str)

print tuples ## [('alice', 'google.com'), ('bob', 'abc.com')]

## list中的元素是tuple

for tuple in tuples:

print tuple[0] ## username

print tuple[1] ## host

正規表示式異常強大,使用簡單的幾條規則就可以演變出很多的模式組合。在確定你的模式之前,可能需要很多的除錯工作。在乙個小的測試集合上測試正規表示式。

正規表示式還可以設定「選項」。

match = re.search(pat,str,opt)
這些可選項如下:

python正規表示式元字元 正規表示式

字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...

python正規表示式及使用正規表示式的例子

正規表示式 正則表達用來匹配字串 正規表示式匹配過程 正規表示式語法規則 匹配除換行 n 外的任意字串 abcabc 轉義字元,使後乙個字元改變原來的意思 a c a c 字符集,對應的位置可以是字符集中任意字元,字符集中的字元可以逐個列出,也可以給出範圍,如 abc 或 a c 第乙個字元如果是 ...

Python 正規表示式

1.在python中,所有和正規表示式相關的功能都包含在re模組中。2.字元 表示 字串的末尾 如 road 則表示 只有當 road 出現在乙個字串的尾部時才會匹配。3.字元 表示 字元中的開始 如 road 則表示 只有當 road 出現在乙個字串的頭部時才會匹配。4.利用re.sub函式對字串...