【问题标题】:Regex to find alphanumeric patterns in a string正则表达式在字符串中查找字母数字模式
【发布时间】:2013-04-16 17:48:49
【问题描述】:

我有正则表达式在字符串中查找长度为 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 等。

谢谢

【问题讨论】:

    标签: python regex


    【解决方案1】:

    match 方法只检查字符串开头的匹配项。

    改用search 方法!

    另外,() 是不必要的。

    如果您的代码中的mainString 实际上是问题顶部的字符串,那么您的代码将无法正常工作,因为for 循环将遍历该字符串中的所有单个字符。

    你可以使用

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

    正则表达式之前的r 确保\b 不被视为字符串转义序列。

    \b 表示单词边界,并确保 6 个字符的字母数字前面或后面没有单词字符。如果没有它们,第一场比赛将是"TRAVELLER" 中的"TRAVEL"

    如果您想获取所有匹配项的列表,请使用 findallfinditer 而不是 search

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

    【讨论】:

    • for k in mainString: m = re.search('[0-9A-Z]{6}', k) if (m): do something 有类似上面的,但还是没有进展!
    • 我收到这个错误:运行时异常:参数 1 必须是字符串或只读字符缓冲区,而不是 _sre.SRE_Match
    【解决方案2】:

    在我看来,您可能需要一些单词边界:

    >>> 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."foobar

    【讨论】:

    • re.findall(r'\b(\w{6})\b$',s,re.M) 摆脱了“RECLOC”异常值。
    • 这不是我想要的模式。感谢您的努力。
    • @pyInTheSky 我想$ 会使最后一个\b 变得多余,因为一行的结尾将是一个单词边界......re.findall(r'\b\w{6}$',s,re.M)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多