【问题标题】:Match words only if preceded by specific pattern仅当前面有特定模式时才匹配单词
【发布时间】:2019-08-17 02:43:27
【问题描述】:

我有一个来自 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 个字符串,直到我想要的字符串。

【问题讨论】:

  • 除了文本长度之外,你还有一些提取文本的逻辑吗? 36 的文本长度是一个非常广泛的标准,也可能与其他标记匹配。
  • 如果我正确理解您想要的内容,您需要在搜索中添加字边界\b。像这样使用它:\b[a-zA-Z]{3}\b 用于 3 个字符串。来自stackoverflow.com/questions/29689516/…
  • 如果您想匹配示例数据中的 3 个或 6 个大写字符,您可以使用带有交替的单词边界 \b(?:[A-Z]{3}|[A-Z]{6})\b example

标签: python regex python-2.7


【解决方案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

【讨论】:

  • 谢谢,这正是我想要的,这个演示非常有用!
  • 如果你有一个像LTUS41 KCAR 141558 AAD RECHNX 这样的组合,而你只想提取“AAD RECHNX”怎么办?
  • @klex52s 这取决于。我可以扩展正则表达式以包含 6 位数字之后的所有大写单词,但这也将包括 TMLB 例如。 AADRECHNX 是您想要匹配的唯一字符串吗?
  • 是的,只有这两个字符串。
  • 其实这个怎么样。如果我的字符串是LTUS41 KCAR 141558 AAD RR4HNX,我将如何匹配 AAD 和 RR4HNX?我尝试在 6 位字符串之后使用匹配条件,但它只找到 AAD。如何匹配字符串中的字符和数字。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多