在python中从文件中获取两个关键字之间的字符串

在python中从文件中获取两个关键字之间的字符串,python,regex,Python,Regex,我试图从一个大的文本文件中获取两个关键字之间的字符串,并以下面的模式逐行搜索每个关键字,然后将其打印并存储在另一个文本文件中 “事件/车轮监视器已删除”(253) “按下事件监视器”(252) “按下事件监视器”(252) “按下事件监视器”(252) 这里我只想提取EVENT()之间的字符串 这里我想说我需要X\u 0\u Gui\u菜单\u 610\u菜单\u状态\u系统 我尝试了以下代码 def get_navigated_pages(): os.chdir('log_file')

我试图从一个大的文本文件中获取两个关键字之间的字符串,并以下面的模式逐行搜索每个关键字,然后将其打印并存储在另一个文本文件中

“事件/车轮监视器已删除”(253) “按下事件监视器”(252) “按下事件监视器”(252) “按下事件监视器”(252)

这里我只想提取EVENT()之间的字符串

这里我想说我需要
X\u 0\u Gui\u菜单\u 610\u菜单\u状态\u系统

我尝试了以下代码

def get_navigated_pages():
    os.chdir('log_file')
    log_file = open('messages','r')
    data = log_file.read()
    navigated_pages = re.findall(r'EVENT(X(.*?)) ',data,re.DOTALL|re.MULTILINE)
    with open('navigated_page_file', 'w') as navigated_page_file:
         navigated_page_file.write(navigated_pages)
我希望文本文件中的输出是这样的

X_0_Gui_Menu_650_Menu_Status_Version 
X_0_Gui_Menu_610_Menu_Status_System 
X_0_Gui_Menu_670_Menu_Status_Media

如上所述,我只想得到以
X_0
开头的输出,忽略以其他关键字开头的输出

尝试转义最外层的括号对

navigated_pages = re.findall(r'EVENT\(X(.*?)\) ',data,re.DOTALL|re.MULTILINE)
这似乎使其正确匹配,至少对于我的小样本输入:

>>> s = "EVENT(X_HELLO) ... EVENT(X_HOW_ARE_YOU_DOING_TODAY)... EVENT(this one shouldn't appear because it doesn't start with X)"
>>> re.findall(r"EVENT\(X(.*?)\)", s)
['_HELLO', '_HOW_ARE_YOU_DOING_TODAY']
如果还需要起始X,则应将内圆括号向左移动1。别担心,我很确定
*?
仍然具有适当的优先级

>>> re.findall(r"EVENT\((X.*?)\)", s)
['X_HELLO', 'X_HOW_ARE_YOU_DOING_TODAY']

使用拆分可能会得逞:

s = "Jan 01 08:11:13 AMIRA-134500021 user.notice gui-monitor[770]: ACTION:401b0836:8:EVENT(X_0_Gui_Menu_610_Menu_Status_System) 'Event_WheelMonitorReleased' (253)"
print(s.split("EVENT(")[1].rsplit(") ",1)[0])
X_0_Gui_Menu_610_Menu_Status_System

with open('message','r') as log_file:
    for line in log_file:
        print(line.split("EVENT(")[1].rsplit(") ",1)[0])

X_0_Gui_Menu_610_Menu_Status_System
X_0_Gui_Menu_610_Menu_Status_System
global_ExportActive_Popup
global_FileOverwrite_Confirm_Popup
global_Global_Reactions
要仅获取
X
行,请执行以下操作:

with open('message','r') as log_file:
    for line in log_file:
        chk = line.split("EVENT(")[1].rsplit(") ",1)[0]
        if chk.startswith("X_"):
            print(chk)
X_0_Gui_Menu_610_Menu_Status_System
X_0_Gui_Menu_610_Menu_Status_System
如果您确信
X
只显示在您想要的行中:

 for line in log_file:
    if "X_" in line:
        chk = line.split("EVENT(")[1].rsplit(") ",1)[0]
        print(chk)

输出结果是什么?我只是在print语句中得到了
('Navigated pages:',[])
,而文本文件中没有任何内容,与此处显示的代码无关。您有一个语法错误(在
open
之前缺少一个带有
),以及多个逻辑和拼写错误(
导航页面文件
导航页面文件
,为
写入提供了一个列表对象)。在您的评论中,您提到了打印语句,但在代码中没有显示任何语句。您应该显示您的实际代码。您好,我忘了添加另一个信息是,还有许多其他此类事件,如
事件(全局电源弹出)
。。。。。下面的代码会打印所有内容,但我只需要以
事件(X_…
@VenkateshPadmanabhan,好的,我的代码只显示以X开头的内容。或者你看到了什么不同的东西吗?我尝试了你发布的第二个变体,因为我也需要X关键字。但是不管起始关键字是什么,它都会发布所有字符串。
EVENT()
里面的所有内容都会打印如下内容
global\u importional\u Popup',global\u listdelect\u Confirm\u Popup',global\u operation failed\u Popup',global\u PlayPressInfo\u Popup',global\u WatchdogWelcomeNavigation',global\u X\u Locked\u Cam\u Info',global\u Y\u LockedDuringRecPrerec\u Info',global\u Z\u Power\u Popup',done',“post”、“开始”、“X\U 0\U Gui\U Menu\U 000\U Menu\U root”、“全局\U EXPORT ACTIVE\U Popup”、“全局\U文件覆盖\U确认\U Popup”、“全局\U全局\U反应”、“全局\U导入\U Popup”、“全局\U列表删除\U确认\U Popup”、“全局\U操作失败\U Popup”、“全局\U PlayPressInfo\U Popup”,“global_WatchdogWelcomeNavigation”
但我只想存储以
X开头的字符串,我不想要其他以其他关键字开头的字符串。