【问题标题】:Regex Search end of line and beginning of next line正则表达式搜索行尾和下一行的开头
【发布时间】:2019-09-06 16:04:24
【问题描述】:

尝试使用正则表达式在行尾和下一行开头搜索关键字匹配(如果存在)

我尝试了下面的正则表达式,但似乎没有返回想要的结果

re.compile(fr"\s(?!^)(keyword1|keyword2|keyword3)\s*\$\n\r\((\w+\W+|W+\w+))", re.MULTILINE | re.IGNORECASE)

例如我的输入是

sentence = """ This is my keyword
/n value"""

上述情况的输出应该是关键字值

提前致谢

【问题讨论】:

  • 您的正则表达式似乎正在尝试匹配关键字 1、关键字 2 或关键字 3,而下一行以 /n 开头,那么您最终如何说输出应该是“关键字值”。我认为您需要准确地重新指定“关键字匹配”是什么以及您在后续行的开头要查找的内容(您是说后续行是可选的,这意味着关键字可能位于字符串的末尾这仍然是一个很好的匹配?)。
  • 这个(keyword\d*)\s*$\s*(\w+.*)怎么样? regex101.com/r/frwd9Q/2.

标签: python regex


【解决方案1】:

您可以匹配关键字(或使用alternation)来匹配更多关键字,并在关键字后和匹配换行符后考虑尾随制表符和空格。

按照您尝试的模式使用 2 个捕获组:

(?<!\S)(keyword)[\t ]*\r?\n[\t ]*(\w+)(?!\S)

说明

  • (?&lt;!\S) 否定后视,断言左边的不是非空白字符
  • (keyword)组 1 中捕获匹配关键字
  • [\t ]* 匹配 0+ 个制表符或空格
  • \r?\n匹配换行符
  • [\t ]* 匹配 0+ 个制表符或空格
  • (\w+) 捕获组 2 匹配 1+ 个单词字符
  • (?!\S) 负前瞻,断言右边的不是非空白字符

Regex demo | Python demo

例如:

import re

regex = r"(?<!\S)(keyword)[\t ]*\r?\n[\t ]*(\w+)(?!\S)"
test_str = (" This is my keyword\n"
    " value")

matches = re.search(regex, test_str)

if matches:
    print('{} {}'.format(matches.group(1), matches.group(2)))

输出

关键字值

【讨论】:

    【解决方案2】:

    \b(keyword)\n(\w+)\b 怎么样?

    \b(keyword)\n(\w+)\b
    
    \b                      get a word boundary
      (keyword)             capture keyword (replace with whatever you want)
               \n           match a newline
                 (\w+)      capture some word characters, one or more
                      \b    get a word boundary
    

    因为keyword\w+ 位于捕获组中,您可以稍后在代码中随意引用它们。

    Try it here!

    【讨论】:

      【解决方案3】:

      我的猜测是,根据您可能拥有的新行数,类似以下的表达式:

      \b(keyword1|keyword2|keyword3)\b[r\n]{1,2}(\S+)
      

      可能有点接近,value\2,你可以让第一组不被捕获,然后:

      \b(?:keyword1|keyword2|keyword3)\b[r\n]{1,2}(\S+)
      

      \1value


      如果您想探索/简化/修改表达式,它已经 在右上角的面板上进行了解释 regex101.com。如果你愿意,你 也可以在this link看,怎么搭配 针对一些样本输入。


      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-19
        • 1970-01-01
        • 2012-02-23
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多