1. 程式人生 > >Perl語言入門(06 正則表示式)

Perl語言入門(06 正則表示式)

由於公司需要,本人最近在學習Perl這種指令碼語言,本文是我在學習Perl的過程中總結出來的一些心得和筆記,希望能夠幫助也在學習Perl的各位同僚。廢話不多說直接上乾貨!!!

————————————————————————— 乾貨分割線 ———————————————————————————

Perl變數$_常常用於Perl需要預設值的時候.

模式表示方式:m/simon/

 Exp:

If(m/Piglet/){

#模式Piglet$_

在這個模式中,除非字元是個元字元,否則每個字元均與自己相匹配。大多數“標準”字元均與自己相匹配,這些字元包括A至Z、a至z和數字。元字元是指改變了模式匹配執行特性的那些字元。下面是元字元的列表:

^ $ () \ | @ [ { ? . + *

在你的模式中,如果想要匹配元字元的原義值,只需要在元字元的前面加上一個反斜槓即可,如下所示:

m/I won \$10 at the fair/;  

前面我們已經講過模式匹配運算子通常用m / /來表示。實際上,在許多情況下,當模式中包含斜槓( /)時且模式的結尾則可能與模式內的斜槓相混淆,可用另一個字元來代替它,因此括號裡面的斜槓的前面必須加上反斜槓,這給閱讀帶來了不便,因此perl規定可以用你想要的任何其他字元來代替斜槓,如下面這個例子所示:

If(m,Waldo,){

    Print “found waldo.\n”;

}

如果將模式括起來的字元(稱為界限符

)是斜槓,那麼編寫模式匹配程式碼時也可以不帶m。因此,也可以將m / C h e e t o s寫成/ C h e e t o s /。通常情況下,除非需要使用不是斜槓( / /)的其他界限符,否則,可以只使用斜槓而不使用m來編寫模式匹配程式碼。變數也可以用在正則表示式中。如果在正則表示式中看到一個標量變數, P e r l首先計算該標量,然後檢視正則表示式。

Exp:

#!/usr/bin/perl
$pat = <STDIN>; chomp $pat;
$_ = "The phrase that pays";
if(/$pat/){
    print "\"$_\" contains the pattern \"$pat\"\n";
}

元字元的介紹:

.(圓點):用於匹配除了換行符外的任何單個字元.如/p.t/可匹配pot,pit,carpet.’.’要求存在一個字元,但不能有更多字元.當普通字元的前面加上反斜槓後,它就變成了元字元。正如你在第2學時中看到的字串那樣,有些字元的前面加上反斜槓後,它在字串中就具備了特殊含義。在正則表示式中,所有這些字元幾乎代表相同的值,如表6 - 1所示:

 

萬用字元:

元字元+用於使前面的字元與後面的字元至少匹配一次,也可以任意次地進行匹配,並且仍然擁有匹配的表示式。因此, / d o + g /將能夠與下面的字串匹配:

Hounddog,hotdog doogie dooooooogdoog,

但不能與下面的字元匹配:

Badge,doofus,Doogie(區分大小寫)

元字元*使得前面的字元可以進行0次或多次匹配。換句話說,模式/ t * /可以進行任意次的匹配,但是,如果沒有匹配的字元存在,這也沒有問題。因此,/ c a r * t /將能夠與下面的字元匹配:

carted,cat,carrrt

但不能與下面的字元匹配:

Carrot,carl,caart

元字元?:用於使前面的字元進行0次或一次匹配(但是不能超過一次)

元字元{}:使用{}可以對你制定的字串進行指定次數的匹配.格式如下:

Pat{n,m};

N為匹配的最小次數,m為最大次數.pat是你試圖量化匹配的字元或字元組,n,m可以分別省略,但不能同時省略,例如:

/x{5,10}/ x至少出現5次最多出現10次

/x{5,}/

/x{0,10}/

/x{5}/   #正好出現5次

萬用字元. *:可以用它來匹配任何東西通常是你感興趣的其他兩樣東西之間的任何東西。例如/ f i r s t . * l a s t /。這個模式設法匹配單詞f i r s t,再匹配它後面的任何東西,然後匹配單詞l a s t。請觀察/ f i r s t . * l a s t /是如何匹配下面的字串的:

first then last; The good players get picked first, the bad last. The first shall be last, and the last shall be first.

P e r l的正則表示式擁有這樣一個工具,它稱為字元類。若要編寫一個字元類,可以用方括號[ ]將這些字元括起來。進行匹配時,字元類中的所有字元被視為單個字元。在一個字元類中,可以設定字元的範圍(在範圍有意義的時候),方法是在上限與下限之間加一個連字元。下面是一些例子:

 

由於]、^和-等字元都是字元類中的特殊字元,因此,如果按照字元的原義來匹配字元類中的這些字元,就要使用某些規則。若要匹配字元類中的原義字元^,必須確保它不出現在字元類中的第一個字元的位置上;若要匹配字元],你既必須將它放在字元類中的第一個字元位置上,也可以在它的前面加上一個反斜槓(例如/[abc\ ] ]/);若要將一個原義連字元( -)放在字元類中,你只需要將它放在字元類中的第一個字元位置上,或者在它的前面放一個反斜槓。

 

| 字元:在|兩邊進行選擇,例 如:

If(/dogs|cats/){

    Print “$_ contains a pet \n”

}

正確的選擇模式為: /(fr|b|cl|fl)og/;  (不同部分用括號) 

$_ = “apple is red ”;

($fruit ,$color ) = /(.*)\sis\s(.*)/;

在上面這個程式碼段中,該模式先對任意物件(用(.*)來表示,作為一個組)進行匹配,然後對白空間(\s)進行匹配,再對單詞i s進行匹配,然後匹配一個白空間(用\s表示),再對任意物件(用(.*)來表示,也作為一個組)進行匹配。這兩個分組的表示式返回左邊的列表,並賦予$ f r u i t和$ c o l o r。

Exp:

$_ = "banana is yellow";
if(($fruit,$color) = /(.*)\sis\s(.*)/){
    print "fruit is $fruit,color is $color\n";
}

輸出:

 

位置萬用字元:

插入記號( ^):正則表示式開頭的插入記號告訴正則表示式只匹配一行開頭的字元。例如, / ^ v i d e o /只匹配單詞v i d e o,如果它出現在一行的開頭的話。

美元符號( $):正則表示式結尾處的美元符號能夠使模式只匹配一行結尾的字元。例如/ e a r t h $ /用於匹配e a r t h ,不過它只能位於行尾。

 

替換運算子S/// :

s/searchpattern/replacement/;替換運算子用於預設搜尋$ ,找出searchpattern, 並且用r e p l a c e m e n t來替換整個匹配的正則表示式。該運算子返回匹配的數量或進行替換的數量,如果沒有進行任何匹配,則返回0

Exp:

$_ = "Our house is in the middle of our street";

s/middle/end/;

print $_;

輸出:

替換運算子也可以使用非斜槓( /)的界限符,使用的方法與匹配運算子相同。只需要直接在s的後面加上你想要的界限符即可,如下所示:

S#searchpattern#replacement#;

連線運算子=~:該運算子不進行賦值,它只是取出右邊的運算子,並使它對左邊的變數進行操作。整個表示式擁有的值與使用$ 時所擁有的值是相同的,如果要對非$_的變數使用匹配運算子和替換運算子,則必須將它們與該變數連線起來。為此可以使用連線運算子= ~

$weight =”185 lbs”;

$weight =~s/lbs//;

 在模式匹配中,若不考慮大小寫字母,可以使用以下程式碼:

/[Mm][Aa][Bb]/;  #笨拙寫法

替換運算子(s / / /)和匹配運算子(m / /)能夠在匹配正則表示式時不考慮大小寫字母

如果匹配項的後面跟一個字母i的話,例如:

/macbeth/i;    #不區分大小寫

上面這個例子可以對M a c b e t h進行匹配,無論它是使用大寫字母、小寫字母還是大小寫混合字母(M a C b E t H)。

Exp:

$f = "one fish,two frogs,red fred,blue foull";
@F = $f =~ m/\W(f\w\w\w)/g;
#@F = $f =~ m/\W(f\w\w)/g;  #3ge\w
#@F = $f =~ m/\W(f\w\w)/;   #無g
print @F;

輸出:

 

該模式首先匹配一個非單詞字元,然後匹配字母f,接著匹配4個單詞字元。字母f和4個單詞用括號分組。該表示式被計算後,變數@ F將包含4個元素,即f i s h、f r o g、f r e d和f o u l。在標量上下文中,修飾符g使得匹配操作迭代通過整個字串,為每個匹配操作返回真,當不再進行更多的匹配操作時,返回假.

Exp:

$letter = 0;

$phrase = "What's my line?";

while($phrase =~/\w/g){

    $letter++;

}

print $letter;

輸出:11

Ps:what’s算一個單詞且’不算.w h a t s m y l i n e共11個

Grep:查詢陣列中特定元素的函式,語法:

Grep expression,list

Grep block list

Exp:

@dogs = qw(greyhound bloodhound terrier dasfhound mutt chihuahua);
@hounds = grep/hound/,@dogs;
print @hounds;

輸出:輸出@dogs中包含Hound的元素

@dogs的每個元素被依次賦予$_.然後根據$_對錶達式/hound/進行測試.返回真的每個元素被grep返回,並存放在@hounds.首先,在表示式中, $ 是對列表中的實際值的引用。如果修改$ ,就會改變列表中的原始元素.

g r e p不一定必須與模式匹配或替換運算子一道使用,它可以與任何運算子一道使用。下面這個例子用於檢索長度超過8個字元的犬名:

@longdogs = grep length($_) > 8,@dogs;

m a p函式:該函式的句法與grep基本相同,不過它的表示式(或語句塊)返回的值是從map返回的,而不是$_的值。可以使用map函式,根據第一個陣列來產生第二個陣列.

Exp:

print "請輸入單詞:\n";
@input = <STDIN>;
chomp;
@words = map{split' ',$_} @input;
print @words;

在這個例子中,陣列@ i n p u t的每個元素(作為$ 傳遞給語句塊)均用空格隔開。這意味著@ i n p u t的每個元素均產生一個單詞列表。該列表存放在@ w o r d s中。@ i n p u t的每個相鄰行均被分隔開來,並在@ w o r d s中進行累加。


相關推薦

Perl語言入門06 表示式

由於公司需要,本人最近在學習Perl這種指令碼語言,本文是我在學習Perl的過程中總結出來的一些心得和筆記,希望能夠幫助也在學習Perl的各位同僚。廢話不多說直接上乾貨!!! ————————————————————————— 乾貨分割線 ——————————————

Python 爬蟲 爬取單個基因 表格資料的生物學功能 urllib+表示式

Python 爬蟲 爬取單個基因的生物學功能(urllib+正則表示式): import re import urllib from urllib import request url = 'https://www.ncbi.nlm.nih.gov/gene/?term=FUT1'

動態保留整數位以及動態保留小數位,然後可可負運用表示式

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>使用者註冊</title> <script src="http://libs.baidu.com/jquery

python進階爬蟲表示式

一、正則表示式的基本知識: 1、正則表示式是一種高度專業化的程式語言,並不是只在python語言中存在,而python需要插入 re 模組才能使用 正則表示式。 2、正則表示式只能處理字串,用於模糊匹配。 3、正則表示式的區間是閉區間。 二、正則表示式組成:   &nb

MyEclipse去除網上覆制下來的程式碼帶有的行號使用表示式

一、正則表示式去除程式碼行號 作為開發人員,我們經常從網上覆制一些程式碼,有些時候複製的程式碼前面是帶有行號,如: MyEclipse本身自帶有查詢替換功能,並且支援正則表示式替換,使用正則替換就可以很容易去除這些行號 使用快捷鍵“ctrl+F”開啟MyEclipse的查詢替換功能,如

Python 爬蟲 爬取單個基因 表格資料的生物學功能 urllib+表示式

Python 爬蟲 爬取單個基因的生物學功能(urllib+正則表示式): import re import urllib from urllib import request url = ‘https://www.ncbi.nlm.nih.gov/gene

Windows 批量重新命名檔案支援表示式

 今天整理了一批檔案,命名有點上亂,所以想批量修改一下。  在網上找了一工具,叫Ant Renamer,相當不錯。主介面如下:  操作步驟很簡單:  1.新增檔案或資料夾,支援自動遞所有子目錄。  2.操作(在這裡設定重新命名的引數)    3.然後點選“開始”即可,左

過濾表情獲取過濾後的字元長度通過表示式

import java.util.regex.Pattern; /** * Created by Basil on 2017/5/10 13:00 */ public class GetInputContentLengh { //加入白名單 public stat

python re庫表示式入門

正則表示式(英文名稱:regular expression,regex,RE)是用來簡潔表達一組字串特徵的表示式。最主要應用在字串匹配中。 \d 數字:[0-9] \D 非數字: [^0-9] \s 空白字元:[ \t\n\x0B\f\r] \S 非空白字元:[^\s] \w 單詞字

Python爬蟲表示式

Python爬蟲(正則表示式) 最近接觸爬蟲比較多,下面我來展示一個剛爬取的成果,使用正則表示式的方法,希望對剛開始接觸爬蟲的小夥伴有所幫助,同時希望大佬們給予點評和指導 接下來,步入正題,使用正則表示式爬取資料是一種原始且有效的方法,正則表示式的作用即字元匹配,匹配出你想得到的

應該是目前最詳細的表示式語音視訊講解教程

(轉)應該是目前最詳細的(正則表示式)語音視訊講解教程 優酷線上地址: http://v.youku.com/v_show/id_XMzg2ODE4MTQ5Mg==.html?x&sharefrom=android&sharekey=a9c982b1c99597d3e1b

【知識積累】、深入Regex表示式

\:將下一個字元標記符、或一個向後引用、或一個八進位制轉義符。例如,“\\n”匹配\n。“\n”匹配換行符。序列“\\”匹配“\”而“\(”則匹配“(”。即相當於多種程式語言中都有的“轉義字元”的概念。 ^:匹配輸入字串的開始位置。如果設定了RegExp物件的Multiline屬性,^也匹配“\n

【知識積累】、瞭解Regex表示式

一、正則表示式簡介 一種可以用於模式匹配和替換的規範,由普通字元 + 特殊字元構成一個模板,用於對目標字串進行匹配、查詢、替換、判斷。 原始碼:JDK1.4中的java.util.regex下的Pattern和Matcher類。 二、常用語法 1、字元取值範圍 [abc]:表示可能是a

鬥圖網鬥圖全站爬取表示式re

import  re  import requests import os class doutu_spyder():     first_url=[]     first_name=[]     headers=

Python:re模組表示式

#!/usr/bin/env python # coding:UTF-8 """ @version: python3.x @author:曹新健 @contact: [email protected] @software: PyCharm @file: re模組簡介.py @time:

C語言實現簡化的表示式

語法: 正則表示式和待匹配字串都是一行 “^” 標記正則表示式的開始 “$” 標記正則表示式的結束 “*” 匹配前面的子表示式零次或多次 “+” 匹配前面的子表示式一次或多次 “?” 匹配前面的子表示式零次或一次, 當該字元緊跟在任何一個其他限制符(*,+,?

js實驗-表單驗證表示式

<!DOCTYPE html> <html lang="en"> <head> <title>Document</title> </head> <script src="./1.js"></s

python之re模組表示式常用函式

1、compile() 編譯正則表示式模式,返回一個物件的模式。(可以把那些常用的正則表示式編譯成正則表示式物件,這樣可以提高一點效率。) 格式: re.compile(pattern,flags=0) pattern: 編譯時用的表示式字串。 flags 編譯標誌位,用於修改正

筆記Python核心程式設計 第 1 部分 通用應用主題 1 章 表示式

                     Python核心程式設計 第 1 部分 通用應用主

匹配任意字元常用表示式的書寫

 http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm   正則教程 (注:元字元包括\ | ( ) [ ] { } ^ $ * + ? . ) 匹配中文字元的正則表示式: [\u4e00-