2013-04-16 111 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

相关问题