麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Regex > 正文

正則表達式筆記三則

2020-03-16 21:12:57
字體:
來源:轉載
供稿:網友
筆記三則,貼在這里。
 
 
首字母大小寫無關模式 
有一段時間,我在寫正則表達式來匹配Drug關鍵字時,經常寫出 /viagra|cialis|anti-ed/ 這樣的表達式。為了讓它更美觀,我會給關鍵詞排序;為了提升速度,我會使用 /[Vv]iagra/ 而非/viagra/i ,只讓必要的部分進行大小寫通配模式。確切地說,我是需要對每個單詞的首字母進行大小寫無關的匹配。 

我寫了這樣的一個函數,專門用來批量轉換。 

復制代碼代碼如下:

#convert regex to sorted list, then provide both lower/upper case for the first letter of each word 
#luf means lower upper first 

sub luf{ 
# split the regex with the delimiter | 
my @arr=sort(split(//|/,shift)); 

# provide both the upper and lower case for the 
# first leffer of each word 
foreach (@arr){s//b([a-zA-Z])/[/l$1/u$1]/g;} 

# join the keyword to a regex again 
join('|',@arr); 


print luf "sex pill|viagra|cialis|anti-ed"; 
# the output is:[aA]nti-[eE]d|[cC]ialis|[sS]ex [pP]ill|[vV]iagra 

控制全局匹配下次開始的位置 

記得jyf曾經問過我,如何控制匹配開始的位置。嗯,現在我可以回答這個問題了。Perl 提供了 pos 函數,可以在 /g 全局匹配中調整下次匹配開始的位置。舉例如下: 
復制代碼代碼如下:

$_="abcdefg"; 
while(/../g) 

print $&; 

其輸出結果是每兩個字母,即ab, cd, ef 

可以使用 pos($_)來重新定位下一次匹配開始的位置,如: 

復制代碼代碼如下:

$_="abcdefg"; 
while(/../g) 

pos($_)--; #pos($_)++; 
print $&; 

輸出結果: 

復制代碼代碼如下:

pos($_)--: ab, bc, cd, de, ef, fg. 
pos($_)++: ab, de. 

可以閱讀 Perl 文檔中關于 pos的章節獲取詳細信息。 

散列與正則表達式替換 
《effective-perl-2e》第三章有這樣一個例子(見下面的代碼),將特殊符號轉義。 
復制代碼代碼如下:

my %ent = { '&' => 'amp', '<' => 'lt', '>' => 'gt' }; 
$html =~ s/([&<>])/&$ent{$1};/g; 

這個例子非常非常巧妙。它靈活地運用了散列這種數據結構,將待替換的部分作為 key ,將與其對應的替換內容作為 value 。這樣只要有匹配就會捕獲,然后將捕獲的部分作為 key ,反查到 value 并運用到替換中,體現了高級語言的效率。 

不過,這樣的 Perl 代碼,能否移植到 Python 中呢? Python 同樣支持正則,支持散列(Python 中叫做 Dictionary),但是似乎不支持在替換過程中插入太多花哨的東西(替換行內變量內插)。 

查閱 Python 的文檔,(在 shell 下 執行 python ,然后 import re,然后 help(re)),: 

復制代碼代碼如下:

sub(pattern, repl, string, count=0) 
Return the string obtained by replacing the leftmost 
non-overlapping occurrences of the pattern in string by the 
replacement repl. repl can be either a string or a callable; 
if a string, backslash escapes in it are processed. If it is 
a callable, it's passed the match object and must return 
a replacement string to be used. 

原來 python 和 php 一樣,是支持在替換的過程中使用 callable 回調函數的。該函數的默認參數是一個匹配對象變量。這樣一來,問題就簡單了: 

復制代碼代碼如下:

ent={'<':"lt", 
'>':"gt", 
'&':"amp", 


def rep(mo): 
return ent[mo.group(1)] 

html=re.sub(r"([&<>])",rep, html) 

python 替換函數 callback 的關鍵點在于其參數是一個匹配對象變量。只要明白了這一點,查一下手冊,看看該種對象都有哪些屬性,一一拿來使用,就能寫出靈活高效的 python 正則替換代碼。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲小视频在线观看,com | 又黄又爽免费无遮挡在线观看 | 欧美一级毛片大片免费播放 | 国产寡妇xxxxxxxx性开放 | 成人精品视频网站 | 香蕉黄色网 | 美女黄色影院 | 亚洲成人精品一区二区 | 国产成年人在线观看 | 国产在线观看av | 国产亚洲美女精品久久久2020 | 国产亚洲精品久久久久久久久 | 日本在线播放一区二区三区 | 成人黄视频在线观看 | 九草在线 | 国产一区免费在线 | 黄色毛片一级视频 | 一区二区三区在线视频观看58 | 国产成人强伦免费视频网站 | hd性videos意大利复古 | 精品一区二区中文字幕 | av噜噜在线| 成人在线a| 精品亚洲一区二区三区 | 免费男女视频 | 99影视电影电视剧在线播放 | 毛片网站视频 | 成人在线视频在线观看 | 国产一区二区免费在线观看 | 久久综合精品视频 | 麻豆视频网 | 制服丝袜日日夜夜 | 九九热在线视频观看 | 叶子楣成人爽a毛片免费啪啪 | 久草手机视频在线观看 | 久久久国产精品免费观看 | 全免费午夜一级毛片真人 | 视频一区 日韩 | 一本一本久久a久久精品综合小说 | 久久千人斩| 日韩美香港a一级毛片 |