提取RegEx匹配项的出现

时间:2019-03-26 16:21:21

标签: python regex python-2.7

正则表达式的新手...找不到我想要的东西。我有一个来自NWS公告的字符串:

LTUS41 KCAR 141558 AAD TMLB Forecast for the National Parks 
KHNX 141001 RECHNX Weather Service San Joaquin Valley

我的目的是提取几个字段。在第一个字符串中,我想要“ AAD”,在第二个字符串中,我想要“ RECHNX”。我尝试过:

( )\w{3} #for the first string

\w{6} #for the 2nd string

但是这些可以找到导致我想要的字符串的所有3和6个字符串。

3 个答案:

答案 0 :(得分:1)

假设您要提取的字段始终以大写字母开头,并以6位数字和一个空格开头,则此正则表达式将达到目的:

(?<=\d{6}\s)[A-Z]+

演示:https://regex101.com/r/dsDHTs/1

编辑:如果要最多匹配两个以6位数字开头的字母数字大写单词,则可以使用:

(?<=\d{6}\s)([A-Z0-9]+\b)\s(?:([A-Z0-9]+\b))*

演示:https://regex101.com/r/dsDHTs/5

如果您有有效字段的特定列表,也可以使用:

(AAD|TMLB|RECHNX|RR4HNX)

https://regex101.com/r/dsDHTs/3

答案 1 :(得分:0)

由于您要提取的子字符串是一个跟在数字后的单词,并用空格分隔,因此您可以将re.search与以下正则表达式结合使用(假设您的输入存储在s中):

re.search(r'\b\d+ (\w+)', s).group(1)

答案 2 :(得分:0)

要从每行中读取第一组单词字符,您可以使用类似 (\w+) (\w+) (\w+) (\w+)

然后,从第一行读取组4和第二行读取组3。

查看以下程序。它从每个源行打印四组:

import re

txt = """LTUS41 KCAR 141558 AAD TMLB Forecast for the National Parks
KHNX 141001 RECHNX Weather Service San Joaquin Valley"""

n = 0
pat = re.compile(r'(\w+) (\w+) (\w+) (\w+)')
for line in txt.splitlines():
    n += 1
    print(f'{n:2}: {line}')
    mtch = pat.search(line)
    if mtch:
        gr = [ mtch.group(i) for i in range(1, 5) ]
        print(f'    {gr}')

结果是:

 1: LTUS41 KCAR 141558 AAD TMLB Forecast for the National Parks 
    ['LTUS41', 'KCAR', '141558', 'AAD']
 2: KHNX 141001 RECHNX Weather Service San Joaquin Valley
    ['KHNX', '141001', 'RECHNX', 'Weather']