2016-02-07 30 views
1

我使用python和正則表達式(兩者都是新的)來查找字符串中的字符序列,如下所示: 獲取p的第一個實例後跟任意數字我總是以p_ _的形式出現,其中_和_將是整數)。然後找到's'或'go',然後找到所有整數直到字符串結尾。例如:Python的正則表達式:查找字符串內的字符序列

ascjksdcvy P12 nbvnzxcm nbmbh HJG

應產生P12去12 23.

ascjksdcvy P12 nbvnzxcm 小號 nbmbh hjg

應該產生P12第12條23.

我只設法得到字符串的一部分P12,這是我到目前爲止已經試過提取「去」或「S」:

decoded = (re.findall(r'([p][0-9]*)',myStr)) 
print(decoded) //prints p12 

我知道這樣做就像

re.findall(r'[s]|[go]',myStr)

東西會給我S和G和O的所有事件,但類似的東西是不是我要找的。我不知道如何結合這些正則表達式來獲得所需的輸出。

回答

2

使用re.findall與圖案分組:

>>> string = 'ascjksdcvyp12nbvnzxcmgonbmbh12hjg23' 
>>> re.findall(r'(p\d{2}).*(s|go)\D*(\d+)(?:\D*(\d+))*', string) 
[('p12', 'go', '12', '23')] 

>>> string = 'ascjksdcvyp12nbvnzxcmsnbmbh12hjg23' 
>>> re.findall(r'(p\d{2}).*(s|go)\D*(\d+)(?:\D*(\d+))*', string) 
[('p12', 's', '12', '23')] 
  • 隨着re.findall我們只願意得到什麼用圖案分組()

  • p\d{2}匹配任意兩位數字p後匹配

  • .*後匹配任何

  • 然後,s|go匹配任一sgo

  • \D*匹配任何數目的非數字

  • \d+指示一個或多個數字

  • (?:)是一個非捕獲組,即比賽中不會出現在輸出時,它僅用於分組的緣故令牌

注:

>>> re.findall(r'(p\d{2}).*(s|go)(?:\D*(\d+))+?', string) 
[('p12', 's', '12')] 

>>> re.findall(r'(p\d{2}).*(s|go)(?:\D*(\d+))+', string) 
[('p12', 's', '23')] 

我想用上面的兩個中的一個作爲後來匹配數字是一種重複的任務,但同時存在非貪婪和貪婪匹配的問題,因此我們需要匹配sgo之後的數字,這是明確的。

+0

我認爲應該是'p \ d {2}'因爲你只想找到兩個數字 –

+0

@ cricket_007 OP表示_any數字_但顯示兩位數......這就是爲什麼我堅持他們先說的話......是的,對於兩位數字,你是對的.. – heemayl

+0

非常感謝你@heemayl,你能解釋一下你在第一個解決方案中做什麼(一個分解會很棒!)?這真的會幫助我提高對正則表達式的理解! – IqK

0

首先,嘗試將您的線與最小圖案相匹配,作爲測試。使用(grouping)(?:nongrouping) parens來捕捉有趣的部分,而不是捕捉無趣的部分。把你所關心的東西存儲起來, 然後切掉字符串的其餘部分,然後搜索數字作爲第二步。

import re 
simple_test = r'^.*p(\d{2}).*?(?:s|go).*?(\d+)' 
m = re.match(simple_test, line) 
if m is not None: 
    p_num = m.group(1) 
    trailing_numbers = [m.group(2)] 

    remainder = line[m.end()+1:] 
    trailing_numbers.extend(    # extend list by appending 
     map(        # list from applying 
      lambda m: m.group(1),   # get group(1) from match 
      re.finditer(r"(\d+)", remainder) # of each number in string 
     ) 
    ) 

    print("P:", p_num, "Numbers:", trailing_numbers) 
相關問題