2013-05-20 67 views
0

我無法將RegEx表達式轉換爲python。我知道'(\\d+)'是單個整數的表達式,但我無法弄清楚如何獲得[2-9]的整數。Python正則表達式問題

正則表達式表達式如下:

[2-9][p-z][a-h][2-9][a-z]*[p-z][2-9][p-z][2-9][p-z] 

這是我目前的表現,但它產生的誤報,因爲它不夠具體:

  re1='(\\d+)' # Integer Number 1 
      re2='([a-z])' # Any Single Word Character (Not Whitespace) 1 
      re3='([a-z])' # Any Single Word Character (Not Whitespace) 2 
      re4='(\\d+)' # Integer Number 2 
      re5='((?:[a-z][a-z]+))' # Word 1 
      re6='(\\d+)' # Integer Number 3 
      re7='([a-z])' # Any Single Word Character (Not Whitespace) 3 
      re8='(.)' # Any Single Character 1 
      re9='([a-z])' # Any Single Word Character (Not Whitespace) 4 
  ## Regex search for passcodes ## Thanks to Pierluigi Failla 
      rg = re.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9,re.IGNORECASE|re.DOTALL) 
      m = rg.search(txt) 
      if m: 
       int1=m.group(1) 
       w1=m.group(2) 
       w2=m.group(3) 
       int2=m.group(4) 
       word1=m.group(5) 
       int3=m.group(6) 
       w3=m.group(7) 
       c1=m.group(8) 
       w4=m.group(9) 
       txt2='"'+int1+w1+w2+int2+word1+int3+w3+c1+w4+'"' 
       return [txt2] 
+5

但是'[2-9]'是匹配的整數,它是正確的2- 9。那麼你首先想要匹配什麼?什麼是你得到的誤報?什麼是你匹配的字符串的例子? – migg

+0

這個問題很不清楚。第一個expr和下面的代碼不匹配。 – dansalmo

+1

你想使用'r'''原始字符串來避免所有加倍的'\\',並且有一個're.VERBOSE'模式來使寫入可讀的表達式比連接9個獨立的字符串更容易。 –

回答

1

我提出這個代碼的基礎上,我在你的問題中看到的:

import re 

pat = ('([2-9])'  # Integer Number 1 
     '([p-z])'  # Any Single Word Character (Not Whitespace) 1 
     '([a-h])'  # Any Single Word Character (Not Whitespace) 2 
     '([2-9])'  # Integer Number 2 
     '([a-z]*[p-z]+)' # Word 1 
     '([2-9])'  # Integer Number 3 
     '([p-z])'  # Any Single Word Character (Not Whitespace) 3 
     '(.)'   # Any Single Character 1 
     '([p-z])'  # Any Single Word Character (Not Whitespace) 4 
     ) 
rg = re.compile(pat) 

txt = 'jiji4pa6fmlgkfmoaz8p#q,,,,,,,,,,' 
m = rg.search(txt) 
if m: 
    text2 = "%s%s%s%s%s%s%s%s%s" % m.groups() 
    print text2 

# prints 4pa6fmlgkfmoaz8p#q 

編輯

text2 = ''.join(m.groups()) # is better 
+0

根據其他評論\ d仍然匹配每個整數。用([2-9])代替它會更具體嗎? – Mondrianaire

+0

哦,我真的很抱歉。我從re1,re2等系列中複製過來,但你說得對:如果你不想要數字0和1,你必須使用''[2-9]''而不是'\ d''。我更正了我的代碼 – eyquem

+0

@Mondrianaire謝謝。我不知道今天我的大腦在哪裏;我編輯了我的答案,以提供一個更簡單的方法來獲得這個問題的結果。 – eyquem

2

您應該可以在Python中使用2-9範圍,如下所示:re1 = re.compile(r'[2-9]')。在我的控制檯中進行的一項測試表明,re1.match('7')可以根據需要返回MatchObject,而re1.match('0')也可以根據需要返回None

您似乎也使用範圍[a-z]re2,你說你想要[p-z] - 在其他字符範圍內的類似問題。

+0

謝謝,我知道我使用的表達式比我想要的要寬鬆得多,我不確定使用[2-9]是否是Python的正確語法。 – Mondrianaire