Regex, чтобы найти слово, а затем извлечь строку, содержащую первое вхождение другого слова непосредственно перед исходным словом? - PullRequest
0 голосов
/ 12 марта 2010

Самый судорожный титул в мире, который я знаю, пример должен объяснить это лучше.У меня большой текстовый файл в следующем формате, хотя детали и количество строк будут меняться каждый раз:

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 Ответ

3 голосов
/ 12 марта 2010
^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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...