提取正则表达式匹配项

2024-05-19 17:38:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个来自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个字符的字符串,这些字符串指向我想要的字符串。你知道吗


Tags: the字符串forstring公告nwsforecastnational
3条回答

由于要提取的子字符串是一个跟在数字后面的单词,用空格隔开,因此可以将re.search与以下regex一起使用(假定您的输入存储在s):

re.search(r'\b\d+ (\w+)', s).group(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

要从每行读取第一组单词字符,可以使用如下模式 (\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']

相关问题 更多 >