为编译运行时关键字编写一个正则表达式

时间:2018-06-28 09:30:06

标签: python regex

text = """ Pratap
pandey
age
25
student
"""
keyword = "age"

re_compile = re.compile('((.*\n+){2})keyword((.*\n+){2})')
re_result = re.findall(re_compile, text)

我想编写一个正则表达式,用于在变量匹配时提取关键字前两行和关键字后两行。

3 个答案:

答案 0 :(得分:0)

我不确定您要问什么。我想您想问的是如何输入名为“关键字”的变量的值

这就是您要做的那个

re.compile(f"(((.*\n+){{2}})\\s*{keyword}\\s*\n((.*\n+){{2}}))")

如果您定义关键字= <某些值>,那么上面的代码将起作用。

顺便说一句。您需要在提取时使用组1来获取所需的内容。

答案 1 :(得分:0)

Python 2.7中的可能解决方案

您可以使用未编译的正则表达式,并在其中放置一些字符串格式。

from __future__ import print_function

import re

text = """ Pratap
pandey
age
25
student
"""
keywords = ("age", "else")

for key in keywords :
    print(re.findall(r'(.*\n+)(.*\n+){}\n+(.*\n+)(.*\n+)'.format(key), text))

输出:

[(' Pratap\n', 'pandey\n', '25\n', 'student\n')]
[]

(*)编辑的正则表达式。

答案 2 :(得分:0)

要在关键字前后匹配两行,请使用如下所示的正则表达式:

(?:.*(?:\r?\n)+){2}age(?:.*(?:\r?\n|$)+){3}

Demo

说明:

  • (?:.*(?:\r?\n|$)+){3}实际上,您需要匹配其中的3个块,因为第一个换行符直接在关键字(age)之后找到,而下一个换行符则找到第4行的结尾({{1} }。因此,需要第三次重复。

但是,由于这可能是字符串的结尾,因此我添加了25作为替代。我还在$之前添加了一个可选的\r,如果您的字符串可能包含Windows行尾,则可以方便使用,否则请删除它们。

Sample code

\n