python正規表示式 小例幾則
會用到的語法
正則字元 |
釋義 |
舉例 |
+ |
前面元素至少出現一次 |
ab+:ab、abbbb 等 |
* |
前面元素出現0次或多次 |
ab*:a、ab、abb 等 |
? |
匹配前面的一次或0次 |
Ab?: A、Ab 等 |
^ |
作為開始標記 |
^a:abc、aaaaaa等 |
$ |
作為結束標記 |
c$:abc、cccc 等 |
\d |
數字 |
3、4、9 等 |
\D |
非數字 |
A、a、- 等 |
[a-z] |
A到z之間的任意字母 |
a、p、m 等 |
[0-9] |
0到9之間的任意數字 |
0、2、9 等 |
注意:
1. 轉義字元
>>> s
'(abc)def'
>>> m = re.search("(\(.*\)).*", s)
>>> print m.group(1)
(abc)
group()用法參考
2. 重複前邊的字串多次
>>> a = "kdlal123dk345"
>>> b = "kdlal123345"
>>> m = re.search("([0-9]+(dk){0,1})[0-9]+", a)
>>> m.group(1), m.group(2)
('123dk', 'dk')
>>> m = re.search("([0-9]+(dk){0,1})[0-9]+", b)
>>> m.group(1)
'12334'
>>> m.group(2)
>>>
示例
一. 判斷字串是否是全部小寫
程式碼
# -*- coding: cp936 -*-
import re
s1 = 'adkkdk'
s2 = 'abc123efg'
an = re.search('^[a-z]+$', s1)
if an:
print 's1:', an.group(), '全為小寫'
else:
print s1, "不全是小寫!"
an = re.match('[a-z]+$', s2)
if an:
print 's2:', an.group(), '全為小寫'
else:
print s2, "不全是小寫!"
結果
究其因
1. 正規表示式不是python的一部分,利用時需要引用re模組
2. 匹配的形式為: re.search(正規表示式, 帶匹配字串)或re.match(正規表示式, 帶匹配字串)。兩者區別在於後者預設以開始符(^)開始。因此,
re.search('^[a-z]+$', s1) 等價於 re.match('[a-z]+$', s2)
3. 如果匹配失敗,則an = re.search('^[a-z]+$', s1)返回None
group用於把匹配結果分組
例如
import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整體
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
1)正規表示式中的三組括號把匹配結果分成三組
group() 同group(0)就是匹配正規表示式整體結果
group(1) 列出第一個括號匹配部分,group(2) 列出第二個括號匹配部分,group(3) 列出第三個括號匹配部分。
2)沒有匹配成功的,re.search()返回None
3)當然鄭則表示式中沒有括號,group(1)肯定不對了。
二. 首字母縮寫詞擴充
具體示例
FEMA Federal Emergency Management Agency
IRA Irish Republican Army
DUP Democratic Unionist Party
FDA Food and Drug Administration
OLC Office of Legal Counsel
分析
縮寫詞 FEMA
分解為 F*** E*** M*** A***
規律 大寫字母 + 小寫(大於等於1個)+ 空格
參考程式碼
import re
def expand_abbr(sen, abbr):
lenabbr = len(abbr)
ma = ''
for i in range(0, lenabbr):
ma += abbr[i] + "[a-z]+" + ' '
print 'ma:', ma
ma = ma.strip(' ')
p = re.search(ma, sen)
if p:
return p.group()
else:
return ''
print expand_abbr("Welcome to Algriculture Bank China", 'ABC')
結果
問題
上面程式碼對於例子中的前3個是正確的,但是後面的兩個就錯了,因為大寫字母開頭的詞語之間還夾雜著小寫字母詞
規律
大寫字母 + 小寫(大於等於1個)+ 空格 + [小寫+空格](0次或1次)
參考程式碼
import re
def expand_abbr(sen, abbr):
lenabbr = len(abbr)
ma = ''
for i in range(0, lenabbr-1):
ma += abbr[i] + "[a-z]+" + ' ' + '([a-z]+ )?'
ma += abbr[lenabbr-1] + "[a-z]+"
print 'ma:', ma
ma = ma.strip(' ')
p = re.search(ma, sen)
if p:
return p.group()
else:
return ''
print expand_abbr("Welcome to Algriculture Bank of China", 'ABC')
技巧
中間的 小寫字母集合+一個空格,看成一個整體,就加個括號。要麼同時有,要麼同時沒有,這樣需要用到?,匹配前方的整體。
三. 去掉數字中的逗號
具體示例
在處理自然語言時123,000,000如果以標點符號分割,就會出現問題,好好的一個數字就被逗號肢解了,因此可以先下手把數字處理乾淨(逗號去掉)。
分析
數字中經常是3個數字一組,之後跟一個逗號,因此規律為:***,***,***
正則式
[a-z]+,[a-z]?
參考程式碼3-1
import re
sen = "abc,123,456,789,mnp"
p = re.compile("\d+,\d+?")
for com in p.finditer(sen):
mm = com.group()
print "hi:", mm
print "sen_before:", sen
sen = sen.replace(mm, mm.replace(",", ""))
print "sen_back:", sen, '\n'
結果
技巧
使用函式finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
搜尋string,返回一個順序訪問每一個匹配結果(Match物件)的迭代器。
參考程式碼3-2
sen = "abc,123,456,789,mnp"
while 1:
mm = re.search("\d,\d", sen)
if mm:
mm = mm.group()
sen = sen.replace(mm, mm.replace(",", ""))
print sen
else:
break
結果
延伸
這樣的程式針對具體問題,即數字3位一組,如果數字混雜與字母間,幹掉數字間的逗號,即把“abc,123,4,789,mnp”轉化為“abc,1234789,mnp”
思路
更具體的是找正則式“數字,數字”找到後用去掉逗號的替換
參考程式碼3-3
sen = "abc,123,4,789,mnp"
while 1:
mm = re.search("\d,\d", sen)
if mm:
mm = mm.group()
sen = sen.replace(mm, mm.replace(",", ""))
print sen
else:
break
print sen
結果
四. 中文處理之年份轉換(例如:一九四九年--->1949年)
中文處理涉及到編碼問題。例如下邊的程式識別年份(****年)時
# -*- coding: cp936 -*-
import re
m0 = "在一九四九年新中國成立"
m1 = "比一九九零年低百分之五點二"
m2 = '人一九九六年擊敗俄軍,取得實質獨立'
def fuc(m):
a = re.findall("[零|一|二|三|四|五|六|七|八|九]+年", m)
if a:
for key in a:
print key
else:
print "NULL"
fuc(m0)
fuc(m1)
fuc(m2)
執行結果
可以看出第二個、第三個都出現了錯誤。
改進——準化成unicode識別
# -*- coding: cp936 -*-
import re
m0 = "在一九四九年新中國成立"
m1 = "比一九九零年低百分之五點二"
m2 = '人一九九六年擊敗俄軍,取得實質獨立'
def fuc(m):
m = m.decode('cp936')
a = re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74", m)
if a:
for key in a:
print key
else:
print "NULL"
fuc(m0)
fuc(m1)
fuc(m2)
結果
識別出來可以通過替換方式,把漢字替換成數字。
參考
numHash = {}
numHash['零'.decode('utf-8')] = '0'
numHash['一'.decode('utf-8')] = '1'
numHash['二'.decode('utf-8')] = '2'
numHash['三'.decode('utf-8')] = '3'
numHash['四'.decode('utf-8')] = '4'
numHash['五'.decode('utf-8')] = '5'
numHash['六'.decode('utf-8')] = '6'
numHash['七'.decode('utf-8')] = '7'
numHash['八'.decode('utf-8')] = '8'
numHash['九'.decode('utf-8')] = '9'
def change2num(words):
print "words:",words
newword = ''
for key in words:
print key
if key in numHash:
newword += numHash[key]
else:
newword += key
return newword
def Chi2Num(line):
a = re.findall(u"[\u96f6|\u4e00|\u4e8c|\u4e09|\u56db|\u4e94|\u516d|\u4e03|\u516b|\u4e5d]+\u5e74", line)
if a:
print "------"
print line
for words in a:
newwords = change2num(words)
print words
print newwords
line = line.replace(words, newwords)
return line
四. 推薦
Python正規表示式指南
轉載請註明本文地址:python正規表示式 小例幾則
相關文章
- 正規表示式例項蒐集,通過例項來學習正規表示式。
- java 正規表示式 舉例Java
- java正規表示式例項Java
- python 正規表示式過濾例項1Python
- Python——正規表示式Python
- Python 正規表示式Python
- Python:正規表示式Python
- python正規表示式Python
- 驗證小數正規表示式程式碼例項
- javascript正規表示式小技巧JavaScript
- Python正規表示式的七個使用範例Python
- Java 正規表示式例項操作Java
- js正規表示式例項(整理)JS
- Python正規表示式手稿Python
- python之正規表示式Python
- Python正規表示式大全Python
- python的正規表示式Python
- python工具_正規表示式Python
- python 的正規表示式Python
- python 正規表示式匹配Python
- 通過js正規表示式例項學習正規表示式基本語法JS
- 正規表示式的小總結
- 正規表示式子表示式程式碼例項
- Python正規表示式保姆式教學,帶你精通大名鼎鼎的正則Python
- python正規表示式(re模組)Python
- 正規表示式(python3)Python
- python re模組 正規表示式Python
- Python 正規表示式 re 模組Python
- 詳解 Python 正規表示式Python
- Python正規表示式詳解Python
- Python正規表示式精講Python
- Python正規表示式基礎Python
- 匹配正負小數正規表示式程式碼
- 正規表示式
- 正規表示式學習筆記(1)-認識正則筆記
- 正規表示式分組例項詳解
- 匹配中文正規表示式程式碼例項
- .NET下正規表示式應用四例