2017-02-17 73 views
1

這個問題的標題可能不足以描述我正在嘗試解決的問題,所以希望我的示例能夠得到重點。我希望一個Python正則表達式是這個職位的合適的工具:Python RegEx重疊

首先,我們lookig這些字符串中的任何一個:

  • CATGTG
  • CATTTG
  • CACGTG

二,圖案爲

  • 6-7字母

  • 匹配:CATGTGXXXXXXCACGTG
  • 沒有匹配:CATGTGXXXCACGTG(因爲之間3個字母)

第三,當找到匹配項時,從前一匹配的結尾開始下一個搜索,包括在內。每場比賽的報告索引。

  • 輸入(空格爲可讀性):XXX CATGTG XXXXXX CATTTG XXXXXXX CACGTG XXX

  • 工作流(空格爲可讀性):

    • 發現匹配: CATGTG XXXXXX CATTTG
    • 它啓動一個牛逼3

    • 在CATTTG

    • 位於C恢復搜索中找到匹配:CATTTG XXXXXXX CACGTG

    • 它開始於15

等等...

經過幾個小時的修補後,我的抱歉嘗試沒有產生我所期望的:

regex = re.compile("CATGTG|CATTTG|CACGTG(?=.{6,7})CATGTG|CATTTG|CACGTG") 
for m in regex.finditer('ATTCATGTG123456CATTTGCCG'): 
    print(m.start(), m.group()) 

3 CATGTG 
15 CATTTG (incorrect) 

如果您可以通過RegEx瞭解這一點,那麼您就是一位天才。謝謝:d

+0

你可以發佈你已經嘗試過的和期望的輸出嗎?你想要一個yes/no的測試字符串等。 – CJC

回答

2

可以使用這種模式:

import re 

s='XXXCATGTGXXXXXXCATTTGXXXXXXXCACGTGXXX' 

regex = re.compile(r'(?=(((?:CATGTG|CATTTG|CACGTG).{6,7}?)(?:CATGTG|CATTTG|CACGTG)))\2') 

for m in regex.finditer(s): 
    print(m.start(), m.group(1)) 

的想法是把整個字符串先行內,使用反向引用消耗你不想之後測試字符。

第一個捕獲組包含整個序列,第二個包含所有字符,直到下一個開始位置。

請注意,您可以將(?:CATGTG|CATTTG|CACGTG)更改爲CA(?:TGTG|TTTG|CGTG)以改善模式。

+2

@WiktorStribiżew:不,用'finditer'我只是添加它。 –

0

主要問題是,爲了使用|字符,您需要將括號內的選項括起來。

從你的例子假設你只想要第一匹配的字符串,請嘗試以下操作:

regex = re.compile("(CATGTG|CATTTG|CACGTG).{6,7}(?:CATGTG|CATTTG|CACGTG)") 
for m in regex.finditer('ATTCATGTG123456CATTTGCCG'): 
    print(m.start(), m.group(1)) 

注意.group(1),這將只匹配什麼是在第一組括號,而不是.group()這將返回整場比賽。