2014-09-27 62 views
0

我解決一個Python挑戰問題找到的文本塊在這樣的大塊格式XXXXXXXXX(下VS大寫,不是所有X):正則表達式表達不匹配正確

jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn

我測試了以下正則表達式,並發現它正確地匹配我從本網站尋找的內容(http://www.regexr.com/):

'([az])([AZ]){3}([az])([AZ ]){3}([az])'

但是,當我嘗試匹配此表達式爲文本塊,它只是返回整個字符串:

In [1]: import re 

In [2]: example = 'jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn' 

In [3]: expression = re.compile(r'([a-z])([A-Z]){3}([a-z])([A-Z]){3}([a-z])') 

In [4]: found = expression.search(example) 

In [5]: print found.string 
jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn 

任何想法?我的表情不正確?此外,如果有更簡單的方式來表示該表達式,請隨時通知我。我對RegEx相當陌生。

+3

文本夾頭沒有匹配的子字符串。 – hwnd 2014-09-27 20:55:26

+0

你在哪些文本上運行它?如果你在你給的例子(uBRrJZ ...)上運行它,那麼你會得到None,因爲hwnd說這個字符串中沒有類似的組。 – BrenBarn 2014-09-27 20:56:34

+0

對,我知道我給的例子沒有。全文長度爲100,000個字符,所以我只貼了一個樣本。應該只有一個匹配。剛剛編輯了一個不同的樣本,確實有這種模式(nJDKoJIWh) – emilylinndb 2014-09-27 21:00:20

回答

1

您需要返回匹配組而不是字符串屬性。

>>> import re 
>>> s = 'jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn' 
>>> rgx = re.compile(r'[a-z][A-Z]{3}[a-z][A-Z]{3}[a-z]') 
>>> found = rgx.search(s).group() 
>>> print found 
nJDKoJIWh 
+0

工作!爲什麼返回.group()工作,但不是.string()? – emilylinndb 2014-09-27 21:12:21

0

string屬性始終返回作爲輸入傳遞給匹配的字符串。這顯然是documented

傳遞到匹配的字符串()或搜索()。

該問題與匹配無關,您只是從匹配對象中抓取錯誤的東西。使用match.group(0)(或match.group())。

0

基於xXXXxXXXx如果你想與LEN 3,下與他們這之間的長度1上字母是你想要什麼:

([a-z])(([A-Z]){3}([a-z]))+ 

你也可以得到你的search功能group()

print expression.search(example).group(0)