1. 程式人生 > >python的正則提取技巧

python的正則提取技巧

轉自:http://ju.outofmemory.cn/entry/71121

用python正則提取字串的方法

在日常工作中經常遇見在文字中提取特定位置字串的需求.python的正則效能好,很適合做這類字串的提取,這裡講一下提取的技巧,正則表示式的基礎知識就不說了,有興趣的可以看re的教程.提取一般分兩種情況,一種是提取在文字中提取單個位置的字串,另一種是提取連續多個位置的字串.日誌分析會遇到這種情況.下面我會分別講一下對應的方法:

1. 單個位置的字串提取

這種情況我們可以使用(.+?)這個正則表示式來提取.舉例,一個字串"a123b",如果我們想提取ab之間的值123,可以使用findall

配合正則表示式,這樣會返回一個包含所以符合情況的list,程式碼如下:

import re
str ="a123b"print re.findall(r"a(.+?)b",str)#輸出['123']

1.1貪婪和非貪婪匹配

如果我們有一個字串”a123b456b”,如果我們想匹配a和最後一個b之間的所有值而非a和第一個出現的b之間的值,可以用?來控制正則貪婪和非貪婪匹配的情況.程式碼如下:

import re
str ="a123b456b"print re.findall(r"a(.+?)b", str)#輸出['123']#?控制只匹配0或1個,所以只會輸出和最近的b之間的匹配情況print
re.findall(r"a(.+)b", str)#輸出['123b456']print re.findall(r"a(.*)b", str)#輸出['123b456']

1.2多行匹配

如果你要多行匹配,那麼需要加上re.Sre.M標誌.加上re.S後, .將會匹配換行符,預設.不會匹配換行符.程式碼如下:

str ="a23b\na34b"
re.findall(r"a(\d+)b.+a(\d+)b", str)#輸出[]#因為不能處理str中間有\n換行的情況
re.findall(r"a(\d+)b.+a(\d+)b", str, re.S)#s輸出[('23', '34')]

加上re

.M後,^$標誌將會匹配每一行,預設^$只會匹配第一行.程式碼如下:

str ="a23b\na34b"
re.findall(r"^a(\d+)b", str)#輸出['23']
re.findall(r"^a(\d+)b", str, re.M)#輸出['23', '34']

2. 連續多個位置的字串提取

這種情況我們可以使用(?P<name>…)這個正則表示式來提取.舉例,如果我們有一行webserver的access日誌:'192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"',我們想提取這行日誌裡面所有的內容,可以寫多個(?P<name>expr)來提取,其中name可以更改為你為該位置字串命名的變數,expr改成提取位置的正則即可.程式碼如下:

import re
line ='192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"'
reg = re.compile('^(?P<remote_ip>[^ ]*) (?P<date>[^ ]*) "(?P<request>[^"]*)" (?P<status>[^ ]*) (?P<size>[^ ]*) "(?P<referrer>[^"]*)" "(?P<user_agent>[^"]*)"')
regMatch = reg.match(line)
linebits = regMatch.groupdict()print linebits
for k, v in linebits.items():print k+": "+v

輸出的結果為:

status:200
referrer: http://abc.com/search
request: GET /api HTTP/1.1
user_agent:Mozilla/5.0
date:25/Oct/2012:14:46:34
size:44
remote_ip:192.168.0.1

相關推薦

python提取技巧

轉自:http://ju.outofmemory.cn/entry/71121 用python正則提取字串的方法 在日常工作中經常遇見在文字中提取特定位置字串的需求.python的正則效能好,很適合做這類字串的提取,這裡講一下提取的技巧,正則表示式的基礎知識就不說了,有

python 提取字串中的漢字,數字,字母

#\d 匹配一個數字字元。等價於 [0-9] #\D 匹配一個非數字字元。等價於 [^0-9] #過濾字串中的英文與符號,保留漢字 import re st = "hello,world!!%[545

python 表示式】python表示式提取郵箱、網址、手機號、ip地址

要從文字中提取電子郵件、url、手機號、ip地址等,我們可以使用殺手鐗正則表示式。下面是我封裝的函式,方便以後拿來直接用。 # encoding: utf-8 import re # 自定義獲取文

python表示式從字串中提取數字

python從字串中提取數字 使用正則表示式,用法如下: ## 總結 ## ^ 匹配字串的開始。 ## $ 匹配字串的結尾。 ## \b 匹配一個單詞的邊界。 ## \d 匹配任意數字。 ## \D

Python 表示式提取Windows路徑中檔名

1. Regular Expression [^\\/:*?"<>|\r\n]+$ eg. c:\foler\file.ext Extract: file.ext 2. Python Code import re subject = 'c:\\foler

python 模塊的使用(re)說明

python re模塊python 正則模塊的使用(re)說明 正則表達式使用反斜桿(\)來轉義特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含義。這可能會和python字面意義上的字符串轉義相沖突,這也許有些令人費解。比如,要匹配一個反斜桿本身,你也許要用‘\\\\‘來做為正則表達式的字符串,因為正

Python表達式之findall疑點

div 表達 clas 例子 表達式 如何實現 如何 正則表達式 正則表達 在findall中使用()進行分組時,得出的結果會優先提取分組的,比如下面這個例子 1 In [46]: re.findall(r"www.(baidu|163).com", "www.baidu

Python-表達式1

findall 模型 一個 re模塊 相關 結束 eight 第一個 () Python中的re模塊提供了正則表達式相關操作。 字符:   . 匹配除換行符以外的任意字符  \w 匹配字母或數字或下劃線或漢字  \s 匹配任意的空白符  \d 匹配數字  \b 匹配單詞

python-表達式

模式 不改變 字符串 ont aid 返回 集合 匹配字符串 內容 使用正則表達式時,需要導入包,import re ,簡單使用如下: 匹配字符串的幾個方法 match :從第一個單詞開始匹配,若匹配成功,則返回一個對象;若沒有匹配數據,則返回None import re

python表達式

表達式 {} spa 執行 color dal 表達 pri 則表達式 元字符 . ^ $ * + ? {} [] | () \ . 匹配除換號符以為的任意一個符號 ret=re.findall(‘李.‘,‘李傑,李剛,王超,占山,李蓮英‘) print(ret) 執行結

Day 26 python 表達式

int print highlight -a 斜杠 數量 反斜杠 find 空格 re模塊\正則表達式 一、元字符 1、. ^ $ * + ? { } [ ] | ( ) \ "."  代表(任意一個字符) "*"  代表(任意數量任意字符,0-無窮) "+"

Python表達式(一)

成功 fin 全部 dal 出現 元組 叠代器 所有 函數 match(pattern,string,flag=0) 匹配成功就返回匹配對象,匹配失敗就返回None。 search(pattern,string,flag=0) 在字符串中搜索第一次出現的正則表達式

Python表達式小結(1)

img src ack ont vba 第一個 xxxxx rgb family 學習一段python正則表達式了, 對match、search、findall、finditer等函數作一小結 以下以一段網頁為例,用python正則表達式作一個範例:

Python表達式(二)

發生 sub pre 則表達式 正則表達式 str1 blog 回發 clas sub()和subn() sub(pattern,repl,string,count=0) 用於實現搜索和替換功能, 使用repl替換所有正則表達式的模式在字符串中出現的位置,除非定義co

python非貪婪模式

logs .cn 如果 貪婪 python http 概念 原理 nbsp 上一篇python正則匹配次數大家應該也發現了,除了?其他匹配次數規則都是盡可能多的匹配 那如果只想匹配1次怎麽辦呢,這就是正則中非貪婪模式的概念了 原理就是利用?與其他匹配次數規則進行組合 +?

python分組

ges 字符 表達式 都是 alt 空串 logs 查找 整體 python的正則表達式本身每一個字符串都是獨立的 看下面的例子就理解分組的含義了~ ab*表示的是查找a和(0個或多個b),就是*是單獨針對b的,所以返回a (ab)*則表示ab是一個組是一個整體,此時*是針

[ Python ] 表達式(1)

solid lnp 額外 spl 字符 正則 -s bject 正則表達 [ Python ] 正則表達式(1) 概念區分:搜索 ( Search ) 和 匹配 ( Match ) from re import search, match search("nana"

Python表達式------進階

指定 表達 得到 表示 關閉 標點符號 one 下劃線 小寫 Python正則表達式 正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。 Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式

PythonRE

asc repl 分割 貪婪 不包含 字符 十進制數 .cn wwwn 就其本質而言,正則表達式(或 RE)是一種小型的、高度專業化的編程語言,(在Python中)它內嵌在Python中,並通過 re 模塊實現。正則表達式模式被編譯成一系列的字節碼,然後由用 C 編寫的匹配

Python表達式模塊re

身份證號碼 cas 返回 eight pri 經典 增加 為什麽 有用 介紹 正則表達式是用來簡介表達一組字符串的表達式,是一種通用的字符串表達框架。 正則表達式是一種正對字符串表達“簡潔”和“特征”思想的工具,正則表達式