在前一个lin上匹配的单词后面的Python捕获编号

2024-09-27 07:20:44 发布

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

我有一个.eml文件,它似乎在同一行上有数据……但在我简单而直接的解析尝试中,很明显,它并不都在同一行上。你知道吗

以下是我打开邮件时的样子:

enter image description here

但在尝试以下代码时:

with open(file_path) as f:
    for line in f:
         if ("Haddock") in line:
            print(line)

打印输出仅限于:

GB Haddock West并且不包括22572

只需将电子邮件正文复制并粘贴到记事本中,这两个值就会相隔几行。因此,我正在寻找一种理想的方法,即“如果找到了X,则捕获下一个数字,无论它位于同一行还是下一行”

有可能吗?你知道吗

顺便说一句,我实际上想要使用的代码是:if any(stock.lower() in line.lower().strip() for stock in stocks):,它正在检查电子邮件中是否出现了30多种鱼类,然后继续。你知道吗

因此,如果下面出现了任何一条鱼,那么捕捉它后面的数字:

stocks = (
        'GB COD EAST',
        'GBE COD',
        'GB COD WEST',
        'GBW COD',
        'GOM COD',
        'GB HADDOCK EAST',
        'GBE HADD',
        'GB HADDOCK WEST',
        'GBW HADD',
        'GOM HADDOCK',
        'GOM HADD',
        'GOM HAD',
        'GOM HADOCK',
        'PLAICE',
        'DABS',
        'POLLOCK',
        'POLL',
        'REDFISH',
        'REDS',
        'RED',
        'WHITE HAKE' ,
        'WHITEHAKE',
        'WHAKE',
        'WHAK',
        'GB WINTER FLOUNDER',
        'GB BB',
        'GB WINTER',
        'GB BLACK BACKS',
        'GB BLACKBACKS',
        'GOM WINTER FLOUNDER',
        'GOM BLACKBACKS',
        'GOM BB',
        'GOM WINTER',
        'SNE WINTER FLOUNDER',
        'SNE WINTER',
        'SNE/MA WINTER FLOUNDER',
        'SNE BLACKBACK',
        'SNE BLACKBACKS',
        'SNE BB',
        'WITCH FLOUNDER',
        'WITCH',
        'WHICH',
        'WHITCH',
        'GREYSOLE',
        'GREY SOLE',
        'CC/GOM YELLOWTAIL FLOUNDER',
        'GOM YELLOWTAIL',
        'GOM YELLOW TAIL',
        'GOM YT',
        'GB YELLOWTAIL FLOUNDER',
        'GB YELLOWTAIL',
        'GB YT',
        'SNE/MA YELLOWTAIL FLOUNDER',
        'SNE YT',
        'SNE YELLOWTAIL',
        'SNE YELLOW TAIL',
        'SCALLOP IFQ'
        )

Tags: inlinecod行上ytbbgbsne
1条回答
网友
1楼 · 发布于 2024-09-27 07:20:44

可以在多行模式下使用正则表达式跨行搜索模式。使用两个捕获组。第一个是stocks列表中项目的并集,第二个是连续的数字序列。你知道吗

整个技术是脆弱的,因为它崩溃了,如果这封电子邮件包含的搜索词以外的模式,你想要的。考虑使用email模块打开文件并拉出消息体或任何包含数据的附件。但这会满足你的要求:

import re

fishy_re = re.compile(r'({}).*?(\d+)'.format('|'.join(stocks)),
    re.IGNORECASE|re.MULTILINE|re.DOTALL)

with open(file_path) as f:
    for match in fishy_re.finditer(f.read()):
        fish, count = match.groups()
        print(fish, count)

正则表达式有点像黑匣子。举一个简单的例子,考虑

>>> stocks = ['COD', 'TUNA']
>>> regex_str = '({}).*?(\d+)'.format('|'.join(stocks))
>>> regex_str
'(COD|TUNA).*?(\\d+)'
  • (COD|TUNA)找到联盟中的任何东西(鳕鱼或金枪鱼),并记住它的位置。

  • .*?是以下所有字符的非贪婪捕获。。。只要他们不符合下一个模式。这将消耗到下一个数字。

  • (\d+)查找一个或多个数字并记住其位置。

我们最终得到两个捕获组,其中包含鱼的名称和数量。你知道吗

相关问题 更多 >

    热门问题