亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > regex > 正文

正則表達式筆記三則

2020-01-20 22:18:12
字體:
來源:轉載
供稿:網友
首字母大小寫無關模式
有一段時間,我在寫正則表達式來匹配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 正則替換代碼。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品国产精品自产a区红杏吧| 国产精品久久久久久久9999| 欧美最猛性xxxxx(亚洲精品)| 日韩av电影手机在线观看| 日本一本a高清免费不卡| 国产亚洲欧美视频| 精品久久久一区二区| 精品国产999| 欧美黄色三级网站| 亚洲最大激情中文字幕| 性欧美办公室18xxxxhd| 国产精品久久久久久久7电影| 国产一区二区成人| 国产日韩欧美夫妻视频在线观看| 在线a欧美视频| 亚洲偷熟乱区亚洲香蕉av| 色播久久人人爽人人爽人人片视av| 性色av一区二区咪爱| 日韩亚洲国产中文字幕| 精品亚洲一区二区三区在线播放| 欧美福利小视频| 欧美黄色www| 91色中文字幕| 国产精品pans私拍| 精品国产精品自拍| 国产成人aa精品一区在线播放| 国产精品美女av| 国产精品美女免费视频| 中文字幕在线视频日韩| 日韩欧美精品中文字幕| 国产精品女视频| 亚洲美女在线观看| 久久精品视频网站| 久操成人在线视频| 精品国模在线视频| 日韩免费观看网站| 91国产精品视频在线| 久久香蕉频线观| 91久久国产婷婷一区二区| 国产欧美最新羞羞视频在线观看| 欧美又大粗又爽又黄大片视频| 久久久久久国产精品美女| 亚洲视频综合网| 亚洲精品中文字幕有码专区| 国产精品吹潮在线观看| 日韩av免费在线播放| 国产成人精品综合久久久| 亚洲国产欧美一区| 国产欧美日韩精品在线观看| 26uuu亚洲伊人春色| 精品国产区一区二区三区在线观看| 久久精品国产清自在天天线| 国产欧美日韩视频| 日韩av成人在线| 美女啪啪无遮挡免费久久网站| 亚洲一区中文字幕| 欧美多人乱p欧美4p久久| 狠狠久久亚洲欧美专区| 国产免费一区二区三区在线能观看| 日韩精品高清视频| 国产亚洲一级高清| 久久久亚洲影院你懂的| 亚洲欧洲激情在线| 欧美日韩精品在线视频| 中文字幕久久久av一区| 欧美日韩午夜剧场| 欧美电影在线播放| 免费不卡欧美自拍视频| 亚洲三级 欧美三级| 久久久爽爽爽美女图片| 亚洲成人精品视频在线观看| 久久综合电影一区| 国语自产精品视频在线看一大j8| 91伊人影院在线播放| www国产亚洲精品久久网站| 91精品91久久久久久| 欧美猛交ⅹxxx乱大交视频| 日韩激情av在线免费观看| 欧美日韩国产中字| 久久久久久久久网站| 久久色精品视频| 久久久精品2019中文字幕神马| 亚洲人成在线电影| 91禁外国网站| 久久在线免费视频| 不卡av电影在线观看| 欧美在线性视频| 国产美女精彩久久| 日韩黄色在线免费观看| 欧美黑人一级爽快片淫片高清| 欧美激情视频网| 久久久久久久久亚洲| 亚洲成人av片| 国内精品久久影院| 欧美大片在线免费观看| 欧美精品18videos性欧| 中文一区二区视频| 日韩精品黄色网| 色婷婷**av毛片一区| 欧美黑人国产人伦爽爽爽| 国产精品91在线| 国产日本欧美一区二区三区| 91精品国产综合久久久久久蜜臀| 91欧美日韩一区| 91精品国产综合久久男男| 日本高清不卡的在线| 欧美主播福利视频| 欧美激情国产精品| 中文字幕亚洲色图| 欧美午夜片在线免费观看| 欧美激情三级免费| 日韩av中文在线| 91精品在线播放| 亚洲成人久久网| 亚洲精品永久免费| 国产精品手机播放| 久久久久国色av免费观看性色| 亚洲欧美精品一区二区| 国产精品成人av性教育| 久久影院资源站| 日本中文字幕不卡免费| 日韩欧美亚洲成人| 亚洲精美色品网站| 久久久久久久91| 91国产美女在线观看| 久久91精品国产91久久跳| 久久久久久久久国产精品| 91精品视频观看| 粗暴蹂躏中文一区二区三区| 2020国产精品视频| 国产美女久久精品香蕉69| 一本一本久久a久久精品综合小说| 欧美性猛交xxxx免费看漫画| 亚洲a在线观看| www日韩中文字幕在线看| 欧美成人黑人xx视频免费观看| 欧美中文在线视频| 亚洲石原莉奈一区二区在线观看| 国产欧美欧洲在线观看| 亚洲最大av在线| 在线观看免费高清视频97| 国产成人精品久久| 在线观看久久av| 欧美电影免费在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 久久国产精品久久久久久久久久| 亚洲精品久久久久久久久| 亚洲欧美制服中文字幕| 韩国三级日本三级少妇99| 国产亚洲精品久久久久久牛牛| 国产亚洲视频在线| 欧美日韩国产中文字幕| 精品久久久久久久久国产字幕| 欧美激情在线观看| 91精品久久久久久久久久久| 亚洲国产成人久久综合| 欧美成人精品三级在线观看| 4438全国亚洲精品在线观看视频| 久久久久国色av免费观看性色| 亚洲欧美精品在线| 51精品在线观看| 精品二区三区线观看| 久久久久免费视频| 欧美激情二区三区|