我們?cè)诿鎸?duì)生物數(shù)據(jù)语泽,比如序列信息(比如堿基序列畏陕、氨基酸序列等)的時(shí)候岛琼, 會(huì)時(shí)常要問(wèn)底循,這其中是否包含著且含有多少某種已知的模式,一段DNA中是否包含轉(zhuǎn)錄起始特征TATA box槐瑞、一段RNA中是否包含某種lncRNA熙涤、一段肽鏈中是否包含鋅指結(jié)構(gòu)等等;另一方面,我們?cè)诓僮鲾?shù)據(jù)時(shí)祠挫,會(huì)時(shí)常遇到諸如把某個(gè)字符(對(duì)象)換成另一種字符(對(duì)象)的替換操作那槽,而其本質(zhì)還是如何搜索符合某種(替換)模式的對(duì)象。
在這些幾乎天天都可以碰到的模式匹配/搜索問(wèn)題中等舔,正則表達(dá)式就是一把解決問(wèn)題的利劍骚灸!
在Python的re模塊中,常用的有四個(gè)方法(match软瞎、search逢唤、findall、finditer)都可以用于匹配字符串涤浇,今天我們先來(lái)了解一下re.match()鳖藕。
re.match()必須從字符串開(kāi)頭匹配!match方法嘗試從字符串的起始位置匹配一個(gè)模式只锭,如果不是起始位置匹配成功的話著恩,match()就返回none。主要參數(shù)如下:
re.match(pattern, string, flags=0)
# pattern 匹配的正則表達(dá)式
# string 要匹配的字符串
# flags 標(biāo)志位蜻展,用于控制正則表達(dá)式的匹配方式喉誊,如:是否區(qū)分大小寫(xiě),多行匹配等等
基礎(chǔ)用法
舉個(gè)栗子來(lái)理解一下它的用法:
import re
print(re.match('dxy', 'dxy.com')) # 在起始位置匹配
print(re.match('dxy', 'dxy.com').span()) # 在起始位置匹配
print(re.match('dxy', 'www.dxy.com')) # 不在起始位置匹配
運(yùn)行結(jié)果:
<re.Match object; span=(0, 3), match='dxy'>
(0, 3)
None
從例子中我們可以看出纵顾,re.match()方法返回一個(gè)匹配的對(duì)象伍茄,而不是匹配的內(nèi)容。通過(guò)調(diào)用span()可以獲得匹配結(jié)果的位置施逾。而如果從起始位置開(kāi)始沒(méi)有匹配成功敷矫,即便其他部分包含需要匹配的內(nèi)容,re.match()也會(huì)返回None汉额。
分組捕獲
一般一個(gè)小括號(hào)括起來(lái)就是一個(gè)捕獲組曹仗。我們可以使用group()來(lái)提取每組匹配到的字符串。
group()會(huì)返回一個(gè)包含所有小組字符串的元組蠕搜,從 0 到 所含的小組號(hào)怎茫。
- 0:表示正則表達(dá)式中符合條件的字符串。
- 1:表示正則表達(dá)式中符合條件的字符串中的第一個(gè)() 中的字符串妓灌。
- 2:表示正則表達(dá)式中符合條件的字符串中的第二個(gè)() 中的字符串轨蛤。
- 以此類推....
直接調(diào)用groups()則直接返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號(hào)虫埂。
再舉一個(gè)栗子:
import re
msg = 'name:Alice,age:6'
obj = re.match('name:(\w+),age:(\d+)', msg)
print(obj.group(0)) # name:Alice,age:6 原始字符
print(obj.group(1)) # Alice 第一匹配
print(obj.group(2)) # 6
print(obj.groups()) # ('Alice', '6')
運(yùn)行結(jié)果:
name:Alice,age:6
Alice
6
('Alice', '6')