生活随笔
收集整理的這篇文章主要介紹了
正则表达式及其在python上的应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天學習了一早上正則表達式。如下內容部分轉載自《讀懂正則表達式就這么簡單》
一、什么是正則表達式
正則表達式是一種特殊的字符串模式,用于匹配一組字符串,就好比用模具做產品,而正則就是這個模具,定義一種規則去匹配符合規則的字符。
1.2 常用的正則匹配工具
在線匹配工具:
1. http://www.regexpal.com/
2. http://rubular.com/
3. http://tools.jb51.net/regex/create_reg
4. txt2re :這個在線網站支持解析一句話,從中可以生成匹配的正則表達式,且可以生成諸多類型的代碼。語言支持:Perl PHP Python Java Javascript ColdFusion C C++ Ruby VB VBScript J#.net C#.net C++.net VB.net
正則匹配軟件
McTracer
用過幾個之后還是覺得這個是最好用的,支持將正則導成對應的語言如java C# js等還幫你轉義了,Copy直接用就行了很方便,另外支持把正則表達式用法解釋,如哪一段是捕獲分組,哪段是貪婪匹配等等,總之用起來 So Happy .
二 正則字符簡單介紹
關于這部分建議跳到: 《讀懂正則表達式就這么簡單》
里面有很詳細的介紹。
另外關于python的正則表達式,主要使用re模塊。
我們以任務為導向介紹python正則表達式的用法。
假設給我們下面這段話:
I1113
23:
35:
50.763059 4460 solver
.cpp:
218] Iteration
400 (
27.3075 iter/s,
0.7324s/
20 iters), loss =
0.0202583
I1113
23:
35:
50.763141 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.00101873 (* 1 = 0.00101873 loss)
I1113
23:
35:
50.763165 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.0192396 (* 1 = 0.0192396 loss)
I1113
23:
35:
50.763175 4460 sgd_solver
.cpp:
105] Iteration
400, lr =
0.001
I1113
23:
35:
51.751206 4460 solver
.cpp:
218] Iteration
420 (
20.2456 iter/s,
0.987868s/
20 iters), loss =
0.00228514
I1113
23:
35:
51.751341 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.00140554 (* 1 = 0.00140554 loss)
I1113
23:
35:
51.751379 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.000879596 (* 1 = 0.000879596 loss)
I1113
23:
35:
51.751410 4460 sgd_solver
.cpp:
105] Iteration
420, lr =
0.001
I1113
23:
35:
52.523890 4460 solver
.cpp:
218] Iteration
440 (
25.8933 iter/s,
0.772401s/
20 iters), loss =
0.0132958
I1113
23:
35:
52.523974 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.00312161 (* 1 = 0.00312161 loss)
I1113
23:
35:
52.523988 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.0101742 (* 1 = 0.0101742 loss)
I1113
23:
35:
52.523998 4460 sgd_solver
.cpp:
105] Iteration
440, lr =
0.001
I1113
23:
35:
53.461998 4460 solver
.cpp:
218] Iteration
460 (
21.3325 iter/s,
0.937539s/
20 iters), loss =
0.0154897
I1113
23:
35:
53.462057 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.00780452 (* 1 = 0.00780452 loss)
I1113
23:
35:
53.462069 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.00768522 (* 1 = 0.00768522 loss)
I1113
23:
35:
53.462082 4460 sgd_solver
.cpp:
105] Iteration
460, lr =
0.001
I1113
23:
35:
54.356657 4460 solver
.cpp:
218] Iteration
480 (
22.3584 iter/s,
0.894517s/
20 iters), loss =
0.00275768
I1113
23:
35:
54.356729 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.00107937 (* 1 = 0.00107937 loss)
I1113
23:
35:
54.356739 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.00167831 (* 1 = 0.00167831 loss)
I1113
23:
35:
54.356748 4460 sgd_solver
.cpp:
105] Iteration
480, lr =
0.001
I1113
23:
35:
55.153437 4460 solver
.cpp:
218] Iteration
500 (
25.1734 iter/s,
0.79449s/
20 iters), loss =
0.0230187
I1113
23:
35:
55.153519 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.0105348 (* 1 = 0.0105348 loss)
I1113
23:
35:
55.153530 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.0124839 (* 1 = 0.0124839 loss)
I1113
23:
35:
55.153542 4460 sgd_solver
.cpp:
105] Iteration
500, lr =
0.001
I1113
23:
35:
56.104395 4460 solver
.cpp:
218] Iteration
520 (
21.0352 iter/s,
0.950785s/
20 iters), loss =
0.0144106
I1113
23:
35:
56.104485 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.00135394 (* 1 = 0.00135394 loss)
I1113
23:
35:
56.104504 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.0130567 (* 1 = 0.0130567 loss)
I1113
23:
35:
56.104521 4460 sgd_solver
.cpp:
105] Iteration
520, lr =
0.001
I1113
23:
35:
56.854631 4460 solver
.cpp:
218] Iteration
540 (
26.6699 iter/s,
0.749909s/
20 iters), loss =
0.0167331
I1113
23:
35:
56.854696 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.00285695 (* 1 = 0.00285695 loss)
I1113
23:
35:
56.854710 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.0138762 (* 1 = 0.0138762 loss)
I1113
23:
35:
56.854720 4460 sgd_solver
.cpp:
105] Iteration
540, lr =
0.001
I1113
23:
35:
57.824692 4460 solver
.cpp:
218] Iteration
560 (
20.6206 iter/s,
0.969902s/
20 iters), loss =
0.00817935
I1113
23:
35:
57.824774 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.00557839 (* 1 = 0.00557839 loss)
I1113
23:
35:
57.824791 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.00260096 (* 1 = 0.00260096 loss)
I1113
23:
35:
57.824806 4460 sgd_solver
.cpp:
105] Iteration
560, lr =
0.001
I1113
23:
35:
58.670575 4460 solver
.cpp:
218] Iteration
580 (
23.6486 iter/s,
0.845714s/
20 iters), loss =
0.00420315
I1113
23:
35:
58.670637 4460 solver
.cpp:
237] Train net output
#0: rpn_cls_loss = 0.0020043 (* 1 = 0.0020043 loss)
I1113
23:
35:
58.670648 4460 solver
.cpp:
237] Train net output
#1: rpn_loss_bbox = 0.00219884 (* 1 = 0.00219884 loss)
I1113
23:
35:
58.670658 4460 sgd_solver
.cpp:
105] Iteration
580, lr =
0.001
I1114
00:
34:
17.348683 4460 sgd_solver
.cpp:
105] Iteration
79980, lr =
0.0001
speed: 0.044s / iter
Wrote snapshot to: /data1/caiyong
.wang/program/py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/zf_rpn_stage1_iter_80000
.caffemodel
希望我們解析出
Iteration 500 (25.1734 iter/s, 0.79449s/20 iters), loss =
0.0230187
中的Iteration與loss值。 其實這是faster rcnn生成的log文件一部分。
我們通過上面的語法學習,在MTracer中生成了正則表達式:
\bIteration\s(?<Iteration>
\d+)
\s\(.*
\).*loss
\s=
\s(?<loss>
\d*\.*
\d+)
\b
注:.*表示除換行符以外的任意字符,*表示0個或多個
并且采用多行模式解析出了我們想要的結果。
上面的表達式中,我們使用了捕獲分組。
如下圖:
那么如何轉化成python代碼?
正確的代碼如下:
import repattern = re.compile(
r'\bIteration\s(?P<Iteration>\d+)\s\(.*\).*loss\s=\s(?P<loss>\d*\.*\d+)\b')
arr=pattern.search(
"I1113 23:35:50.763059 4460 solver.cpp:218] Iteration 400 (27.3075 iter/s, 0.7324s/20 iters), loss = 0.0202583")
arr.groups()
arr.group()
arr.group(
"Iteration")
arr.group(
"loss")
結果為:
arr.groups()
Out[
147]: (
'400',
'0.0202583')arr.group()
Out[
148]:
'Iteration 400 (27.3075 iter/s, 0.7324s/20 iters), loss = 0.0202583'arr.group(
"Iteration")
Out[
149]:
'400'arr.group(
"loss")
Out[
150]:
'0.0202583'
這里python的命名組與以往的不一樣,使用的是 (?P<name>exp) 取代(?<name>exp)
而且compile里面必須加上r。
參考文獻:
- http://blog.csdn.net/lwnylslwnyls/article/details/8901273
- https://www.cnblogs.com/tk091/p/3702307.html
- PYTHON的RE模塊理解(RE.COMPILE、RE.MATCH、RE.SEARCH)
三 python正則表達式的其他用法。
多行匹配:
python多行匹配
r = re
.compile(
"需要的正則表達式", re
.M)
匹配到需要的字符,可以獲取紅括號內的數字
r = re.compile("r([0-9]{5,})")
舉個例子: 需要獲取20462和24729連個數字
import re
data =
"""r24062 line1hello word !!!!r24729 line2revision:24181"""r = re.compile(
"^r([0-9]{5,})", re.M)nums = r.findall(data)
print nums---------------------
output:[
"24062",
"24729"]
注:{5,}表示至少重復5次
2. 無捕獲分組
當你要將一部分規則作為一個整體對它進行某些操作,比如指定其重復次數時,你需要將這部分規則用
(?:)
把它包圍起來。
分支條件
在正則表達式中,分支條件是一個很常用的條件。
滿足條件A 或者 滿足條件B ,這個時候我們就可以使用分支條件了。
分支條件使用的符號為
|
代碼示例:
我們突然發現,它把字符串分割成兩個部分了
I have a dog 和 cat 而不是 I have a dog 和 I have a cat
如果我們只要區分dog和cat呢?正則要怎么寫?我添加一個括號試試
還是不對,前面的 “I have a ”根本沒有匹配
正確的寫法是應該使用無捕獲分組
參考:正則表達式-python-無捕獲分組與分支選擇
總結
以上是生活随笔為你收集整理的正则表达式及其在python上的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。