【问题标题】:Regex matching a text after a specific string until another specific string正则表达式匹配特定字符串之后的文本,直到另一个特定字符串
【发布时间】:2018-08-11 18:24:52
【问题描述】:

如果我有以下示例:

X-FileName: pallen (Non-Privileged).pst

Here is our forecast

 Message-ID: <15464986.1075855378456.JavaMail.evans@thyme>

如何选择文字

Here is our forecast 

在“X-FileName ....\n”之后直到“Message-ID”被排除?

我阅读了前瞻和后视并尝试了这个但没有奏效:

(?<=X-FileName:(\n)+$).+(?=Message-ID:)

【问题讨论】:

  • 您可以使用s.split("\n\n")[1]。或re.search(r'X-FileName:.*[\r\n]+(.+)', s).group(1)
  • @WiktorStribiżew 第二个有什么问题吗?
  • 我不了解 Python,但在大多数语言中,上面的 $ 指的是整个字符串的结尾,而不是后面的结尾。实际上,您甚至不允许在编译时不知道后向字符串的长度的情况下进行后向检查(在这种情况下由于+ 而不是)。

标签: regex python-3.5


【解决方案1】:

应该这样做:

(?:X-FileName:[^\n]+)\n+([^\n]+)\n+(?:Message-ID:)(第 1 组是比赛)

Demo

解释:

(?:X-FileName:[^\n]+) 匹配 X-Filename: 后跟任意数量的非换行符,而不捕获它 (?:)。

\n+ 匹配任意数量的连续换行符。

([^\n]+) 匹配并捕获任意数量的非换行符的连续字符。

\n+ 再次匹配任意数量的连续换行符。

(?:Message-ID:) 匹配 Message-ID: 而不捕获它 (?:)。

编辑:正如@WiktorStribiżew 提到的那样,将文本分成几行可能是检索所需内容的更简单/更清晰的方式。

【讨论】:

  • 行包含 X=Filename 和 Message-ID 被排除在外。
  • 第 1 组正好包含“这是我们的预测”(demo 上的绿色)。不是你要求的吗?
【解决方案2】:

这里有两种方法,它们取决于更广泛的背景。如果您预期的子字符串是第二段,只需使用\n\n(或\r\n\r\n)拆分并从结果列表中获取第二项。

如果是较大文本中的文本,请使用正则表达式。

查看 Python 演示:

import re
s='''X-FileName: pallen (Non-Privileged).pst

Here is our forecast

Message-ID: <15464986.1075855378456.JavaMail.evans@thyme>'''
# Non-regex way for the string in the exact same format
print(s.split('\n\n')[1])
# Regex way to get some substring in a known context
m = re.search(r'X-FileName:.*[\r\n]+(.+)', s)
if m:
    print(m.group(1))

正则表达式的意思是:

  • X-FileName: - 文字子串
  • .* - 除换行符以外的任何 0+ 个字符
  • [\r\n]+ - 1 个或多个 CR 或 LF 字符
  • (.+) - 第 1 组:一个或多个除换行符以外的字符,尽可能多。

请参阅regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2023-02-01
    相关资源
    最近更新 更多