中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中正則表達式的用法

發布時間:2021-07-02 10:50:55 來源:億速云 閱讀:136 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關python中正則表達式的用法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

re 模塊使 Python 語言擁有全部的正則表達式功能。

會用到的語法

正則字符釋義舉例
+前面元素至少出現一次ab+:ab、abbbb 等
*前面元素出現0次或多次ab*:a、ab、abb 等
?匹配前面的一次或0次Ab?: A、Ab 等
^作為開始標記^a:abc、aaaaaa等
$作為結束標記c$:abc、cccc 等
\d數字3、4、9 等正則字符釋義舉例+前面元素至少出現一次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 等
\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)

re.match函數

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

實例1:

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

輸出結果:

(0, 3)
None

實例2:

#!/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!!"

輸出結果:

matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter

上面是python2的print輸出,python記得加()即可,python輸出類似的別的語言的\n之類來匹配獲取的內容。

python group()

正則表達式中,group()用來提出分組截獲的字符串,()用來分組

重復前邊的字串多次

>>> 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)
>>>

究其因

1. 正則表達式中的三組括號把匹配結果分成三組

group() 同group(0)就是匹配正則表達式整體結果
group(1) 列出第一個括號匹配部分,group(2) 列出第二個括號匹配部分,group(3) 列出第三個括號匹配部分。
2. 沒有匹配成功的,re.search()返回None

3. 當然正則表達式中沒有括號,group(1)肯定不對了。

示例

1. 判斷字符串是否是全部小寫

# -*- 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, "不全是小寫!"

結果

python中正則表達式的用法

究其因

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

輸出結果

123abc456
123
abc
456

1)正則表達式中的三組括號把匹配結果分成三組

  group() 同group(0)就是匹配正則表達式整體結果

  group(1) 列出第一個括號匹配部分,group(2) 列出第二個括號匹配部分,group(3) 列出第三個括號匹配部分。

2)沒有匹配成功的,re.search()返回None

3)當然正則表達式中沒有括號,group(1)肯定不對了。

2. 首字母縮寫詞擴充

具體示例

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')

結果

python中正則表達式的用法

問題

上面代碼對于例子中的前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')

技巧

中間的 小寫字母集合+一個空格,看成一個整體,就加個括號。要么同時有,要么同時沒有,這樣需要用到?,匹配前方的整體。

3. 去掉數字中的逗號

具體示例

在處理自然語言時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'

結果

python中正則表達式的用法

技巧

使用函數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

結果

python中正則表達式的用法

延伸

這樣的程序針對具體問題,即數字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

結果

python中正則表達式的用法

4. 中文處理之年份轉換(例如:一九四九年--->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)

運行結果

python中正則表達式的用法

可以看出第二個、第三個都出現了錯誤。

改進——準化成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)

結果

python中正則表達式的用法

識別出來可以通過替換方式,把漢字替換成數字。

參考

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

5. 多個手機號碼,中間用|隔開

舉例:

空值
12222222222
12222222222|12222222222
12222222222|12222222222|12222222444

表達式

s = "[\\d]{11}(\\|[\\d]{11})*|"

關于“python中正則表達式的用法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

娄底市| 慈利县| 平舆县| 临猗县| 青浦区| 温州市| 土默特左旗| 墨江| 内江市| 绥化市| 剑阁县| 黄梅县| 安康市| 邵阳县| 泾阳县| 界首市| 信阳市| 麻栗坡县| 祁门县| 黄龙县| 玉田县| 克东县| 凤阳县| 南通市| 靖安县| 达拉特旗| 兴宁市| 云梦县| 浦江县| 盘锦市| 乐都县| 马尔康县| 改则县| 太湖县| 万全县| 宜宾市| 嘉鱼县| 浑源县| 镇巴县| 沛县| 北海市|