我有以下字串:
seq = 'MNRYLNRQRLYNMYRNKYRGVMEPMSRMTMDFQGRYMDSQGRMVDPRYYDHYGRMHDYDRYYGRSMFNQGHSMDSQRYGGWMDNPERYMDMSGYQMDMQGRWMDAQGRYNNPFSQMWHSRQGH'
也保存在一個名為seq.dat. 如果我使用以下grep命令
grep '\([MF]D.\{4,6\}\)\{3,10\}' seq.dat
我得到以下匹配字串:
MDNPERYMDMSGYQMDMQGRWMDAQGRYN
這就是我想要的。換句話說,我想要匹配的是與字串一樣多的連續重復[MF]D.{4,6}。我不想匹配連續重復次數少于 3 次的情況,但我希望它能夠捕獲多達 6 次。
現在,我正在嘗試用 python 來做到這一點。我有
p = re.compile("(?:[MF]D.{4,6}){3,10}")
嘗試search()回報
MDNPERYMDMSGYQMDMQGRWM
這是接近我尋求的答案,但仍然缺少最后一個MDAQGRYN。我猜這是因為.{4,6}匹配M,這反過來又阻止{3,10}了捕獲 的第 4 次出現([MF]D.{4,6}),但是由于我要求至少 3 次,所以它很高興并且停止了。
如何讓 Python 正則運算式表現得像 grep 一樣?
uj5u.com熱心網友回復:
POSIX(“文本導向”)和 NFA(“正則運算式導向”)引擎之間存在根本區別。POSIX 引擎(grep這里使用 POSIX BRE 正則運算式風格,它是默認使用的風格)將決議應用正則運算式的輸入文本并回傳可能的最長匹配。NFA 引擎(Pythonre引擎是一個 NFA 引擎)這里不會在后續模式部分匹配時重新消費(回溯)。
請參閱正則運算式導向和文本導向引擎的參考:
一個正則運算式導向的引擎遍歷正則運算式,嘗試將正則運算式中的下一個標記與下一個字符匹配。如果找到匹配項,引擎將通過正則運算式和主題字串前進。如果令牌無法匹配,引擎將回溯到正則運算式和主題字串中的先前位置,在該位置它可以嘗試通過正則運算式的不同路徑...使用正則運算式導向引擎的現代正則運算式風格具有許多功能,例如原子分組和所有格量詞,允許您控制這種回溯。
文本導向引擎遍歷主題字串,在前進到字串中的下一個字符之前嘗試正則運算式的所有排列。文本導向的引擎永遠不會回溯。因此,沒有太多關于文本導向引擎的匹配程序的討論。在大多數情況下,文本導向引擎會找到與正則運算式導向引擎相同的匹配項。
最后一句說“在大多數情況下”,但不是所有情況,您的情況很好地說明了可能會出現差異。
為了避免消耗M或F緊隨其后D,我建議使用
(?:[MF]D(?:(?![MF]D).){4,6}){3,10}
請參閱正則運算式演示。詳情:
(?:- 外部非捕獲容器組的開始:[MF]D-M或者F然后D(?:(?![MF]D).){4,6}- 任何重復四到六次的字符(換行符除外),它不會開始一個MD或FD字符序列
){3,10}- 外組結束,重復3到10次。
順便說一句,如果您只想匹配大寫 ASCII 字母,請將 替換.為[A-Z].
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/444971.html
上一篇:正則運算式-捕獲組內的組
