【问题标题】:Capturing two different lines using regex使用正则表达式捕获两条不同的行
【发布时间】:2020-01-20 03:49:07
【问题描述】:

我想在一个变量中捕获两行,这是我的输入:

Rose 0 82
ABC 0 0
ABC (Backup) 0 0
ABC XYZ 637 2021
ABC XYZ (Backup) 0 0
ABC EXYZ 0 0

我想捕捉粗体字。

我试过这段代码:

var = re.search("ABC\s+\d+\s+ .*\n(.*)\nABC XYZ .*",file_name)

但它给了我这样的输出:

ABC                           0                        0
ABC (Backup)                  0                        0
ABC XYZ                       637                      2021

我的预期输出是这样的:

ABC                           0                        0
ABC XYZ                       637                      2021

有人可以建议需要什么修改。

【问题讨论】:

标签: regex python-3.x


【解决方案1】:

您可以使用“^”和“$”来捕捉一行的开始和结束。

^\*\*.*\*\*

这将为您提供 2 个匹配项进行迭代。所有匹配代表血统,由行首尾的两个 * 限定。

【讨论】:

  • 真实文本中没有星号。 OP 尝试将文本加粗(我想捕获以粗体显示的行。),但未能正确格式化问题。
【解决方案2】:

如果语法包含以两颗星开头的注释,则可以使用它(但如果它们在一行中,它不会剪切两个 cmets)。

^[\*]{2}(.*)[\*]{2}

如果您想查找任何**comment** 形式的评论,请使用此

[\*]{2}[^\*]+[\*]{2}

【讨论】:

  • 真实文本中没有星号。 OP 尝试将文本加粗(我想捕获以粗体显示的行。),但未能正确格式化问题。此外,如果有星号,则 OP 当前输出会有所不同。
  • 好的,谢谢。因此,如果他只想要星星之间的部分,那么他可以使用 res = re.findall(r"[\*]{2}[^\*]+[\*]{2}",myString) 查找所有 cmets 并使用 res = [elem.replace("**","") for elem in res] 删除星星。这是你的意思吗?
  • 不,没有星号。
  • 是的,没有**。我尝试将其加粗,但未能格式化。 @lesem
【解决方案3】:

你可以使用

re.search("^(ABC[ \t]+\d+[ \t].*\n).*\n(ABC[ \t]+XYZ[ \t].*)",s, re.MULTILINE)

正则表达式会找到您需要的匹配项并将 2 行捕获到单独的捕获组中。然后,检查是否匹配,如果匹配,则加入两个捕获组值。

Python demo

import re
s="""Rose                          0                        82
ABC                           0                        0
ABC (Backup)                  0                        0
ABC XYZ                       637                      2021
ABC XYZ (Backup)              0                        0
ABC EXYZ                      0                        0"""

v = re.search("^(ABC[ \t]+\d+[ \t].*\n).*\n(ABC[ \t]+XYZ[ \t].*)",s, re.MULTILINE)
if v:
    print("{}{}".format(v.group(1), v.group(2)))

输出:

ABC                           0                        0
ABC XYZ                       637                      2021

模式详情

  • ^ - 一行的开始(由于re.MULTILINE
  • (ABC[ \t]+\d+[ \t].*\n) - 捕获组 1:ABC,1+ 个空格或制表符,1+ 个数字,一个空格或制表符,然后是换行符的其余行
  • .*\n - 整个下一行
  • (ABC[ \t]+XYZ[ \t].*) - - 捕获组 2:ABC,1+ 个空格或制表符,XYZ,一个空格或制表符,然后是该行的其余部分。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多