正则表达式找到一个单词,然后在原始单词之前提取一行包含不同单词的第一个出现?

时间:2010-03-12 11:53:12

标签: regex

我知道世界上最令人沮丧的头衔,一个例子应该更好地解释它。我有一个以下格式的大型txt文件,但细节和行数将每次都改变:

Username: john_joe                    Owner:  John Joe
Account:  
CLI:      
Default:  
LGICMD:   
Flags: 
Primary days:
Secondary days: 
No access restrictions
Expiration: 
Pwdlifetime:
Last Login: 
Maxjobs:    
Maxacctjobs:
Maxdetach:  
Prclm:      
Prio:       
Queprio: 
CPU:     
Authorized Privileges: 
  BYPASS
Default Privileges: 
  SYSPRV

对于不同的用户,该序列重复了几千次。我需要在“默认权限”下找到具有SYSPRV的每个用户(理想情况下是上面的第一行)。 我知道我可以编写一个应用程序来执行此操作,我只是希望它们可能是一个很好的正则表达式我可以使用。

干杯

1 个答案:

答案 0 :(得分:3)

^Username:\s*(\S+)((?!^Username).)*Default Privileges:\s+SYSPRV

使用选项使^匹配行开头,并使点匹配换行符,将隔离这些记录并在反向引用号中捕获用户名。 1.告诉我你正在使用哪种语言,我将提供一个代码示例。

说明:

^Username:\s:匹配行开头的“用户名”,冒号和任何空格。

(\S)+“:匹配任何非空白字符并将其捕获到反向引用号1.这将是用户名。

((?!Username).)*:匹配任何字符,只要它不是“用户名”的“U”即可。这样可以确保我们不会意外地进入下一条记录。

Default Privileges:\s+SYSPRV:匹配所需的文字。

因此,在Python中,您可以使用:

result = re.findall(r"(?sm)^Username:\s*(\S+)((?!^Username).)*Default Privileges:\s+SYSPRV", subject)