2013-04-16 118 views
1

我有正則表達式來查找字符串中長度爲6的字母數字。該字符串是類似下面的東西:正則表達式來查找字符串中的字母數字模式

PLT\n\nTRAVELLER NAME LIST\n\n  TRAVELLER    RECLOC COMPANY\n 1   TESTNUMBERFIVEQA/TESTN WL9795\n 2 TESTNUMBERONEYQWA/TEST RHFQCD\n 3 TESTNUMBERONEYQWAZZZ/T 1QZ1JF\n 4 TESTNUMBERONEYQWAZZZM/ N3BZW8\n 5 TESTNUMBERONEYQWAZZZMK 05RXPM\n 6 TESTNUMBERONEYQWAZZZMK 2XR9ZR\n 7 TESTNUMBERTHREEZZZ/TES 0Q14S4\n 8 TESTNUMBERTHREEZZZM/TE LRRKW3\n 9 TESTNUMBERTHREEZZZMK/T 949Z4T\n 10 TESTNUMBERTHREEZZZMKJ/ 51WFM2\n 11 TESTNUMBERTWOZZA/TESTN PRGWVT\n 12 TESTNUMBERTWOZZAZZZ/TE SM0BHS\n 13 TESTNUMBERTWOZZAZZZM/T QRJLH1\n 14 TESTNUMBERTWOZZAZZZMK/ R69NHV\n 15 TESTNUMBERTWOZZAZZZMKJ 67XKF7\n 16 TESTNUMBERTWOZZAZZZMKJ 68PV7P\n 17 TESTNUMBERTWOZZAZZZMKJ GCZZ0C\n)> 18 TESTNUMBERTWOZZAZZZMKJ MLMS3L\n 19 TESTNUMBERTWOZZAZZZMKJ 3R1S49\n 20 TESTNUMBERTWOZZAZZZMKJ WB700R\n 21 TESTNUMBERTWOZZAZZZMKJ 718KRC\n 22 TESTNUMBERTWOZZAZZZMKJ RTQH2H\n 23 TESTNUMBERTWOZZAZZZMKJ N2FLM6\n 24 TESTNUMBERTWOZZAZZZMKJ 40M1FR\n 25 TESTNUMBERTWOZZAZZZMKJ 71D3HF\n 26 

我已經試過正則表達式是這樣的:

for k in mainString: 
    m = re.match('([0-9A-Z]{6})', k) 
    if (m): 
     do something 

但預期其無法正常工作。有人可以指出我可能犯了一個錯誤嗎? 我找的圖案像WL9795,RHFQCD等

感謝

回答

4

match方法僅適用於匹配字符串的開始檢查。

改爲使用search方法!

此外,()是不必要的。

如果您的代碼中的mainString實際上是您問題頂部的字符串,那麼您的代碼將無法正常工作,因爲for循環將迭代該字符串中的所有單個字符。

相反,你可以使用

m = re.search(r'\b[0-9A-Z]{6}\b', mainString) 
if (m): 
    print(m.group()) 

r前的正則表達式確保\b不是作爲一個字符串轉義序列治療。

\b意味着單詞邊界,並確保6個字符的字母數字字符不是前後的單詞字符。沒有他們,第一場比賽將是"TRAVEL""TRAVELLER"

如果您想獲得所有匹配的列表,請使用findallfinditer而不是search

for m in re.finditer(r'\b[0-9A-Z]{6}\b', mainString): 
    print(m.group()) 
+0

在mainString匹配foobar對於k: 米= re.search( '[0-9A-Z] {6}',k)的 如果(米): 做點事 有上面的東西,但仍然沒有進展! – RAB

+0

我得到這個錯誤: 運行時異常:參數1必須是字符串或只讀字符緩衝區,而不是_sre.SRE_Match – RAB

+0

findall工作,謝謝 – RAB

3

在我看來,你可能想在那裏的一些字邊界:

>>> print re.findall(r'\b\w{6}\b',s) 
['RECLOC', 'WL9795', 'RHFQCD', '1QZ1JF', 'N3BZW8', '05RXPM', '2XR9ZR', '0Q14S4', 'LRRKW3', '949Z4T', '51WFM2', 'PRGWVT', 'SM0BHS', 'QRJLH1', 'R69NHV', '67XKF7', '68PV7P', 'GCZZ0C', 'MLMS3L', '3R1S49', 'WB700R', '718KRC', 'RTQH2H', 'N2FLM6', '40M1FR', '71D3HF'] 

此正則表達式的字母數字圖案,這些的確字符匹配。換句話說,它不"foobarbaz"匹配任何東西,但它將從"foobar."

+0

re.findall(r'\ b(\ w {6})\ b $',s,re.M)擺脫了'RECLOC'異常值。 – pyInTheSky

+0

這不是我所需要的模式。 感謝您的努力。 – RAB

+0

@pyInTheSky我猜想'$'會使最後一個'\ b'變成多餘的,因爲一行的結尾會是一個字邊界...'''''''''''''''' S,re.M被)' – mgilson

相關問題