2016-12-28 8 views
1

это только мой второй вопрос, размещенный на этом сайте, но я много читал этот сайт. В любом случае, мне трудно получить регулярное выражение для соответствия строке в python. То, что я делаю, это получение журнала из SVN и сохранение его в svn_log. Затем я перехожу в цикл for, который читает журнал за строкой и пытается сопоставить его с шаблоном регулярного выражения, однако он всегда возвращается без совпадений. Вот цикл я бег:Проблема с регулярным выражением для соответствия строке в SVN Войти Python

#Scan each line until the changed paths are located. 
pattern = re.compile(r"((M|A|D) /.+)") 
changed_paths = [] 
    for line in svn_log: 
     if pattern.match(line): 
      # Save the changed paths in a list. 
      changed_paths.append(line) 

В моих комментариях говоря, я пытаюсь восстановить измененные пути из журнала SVN. Измененные пути, которые я хочу, начинаются с символа M, A или D. Вот пример журнала, который я использую для тестирования этого скрипта.

r14 | autobuild | 2016-12-27 16:22:21 -0800 (Tue, 27 Dec 2016) | 2 lines 
Changed paths: 
    M /trunk/src/board/ozmo.c 
    M /trunk/src/ganymede/main.c 

Я могу разобрать каждую строку из этого журнала и распечатать его, но когда я пытаюсь соответствовать моему шаблону регулярного выражения с двумя последними строками, я не получаю матчей, и ничто не добавляется к моему changed_paths переменному. Я пробовал тестировать свое регулярное выражение, используя следующий веб-сайт: http://www.pyregex.com, и он работает там, только не в моем скрипте. Дайте мне знать, если вы видите что-то не так в моем шаблоне регулярного выражения или в цикле. Благодарю.

ответ

0

Вы используете match instead of search. match совпадают только в начале строки, вам необходимо search или вы можете добавить \s* к регулярному выражению

line = ' M /trunk/src/board/ozmo.c' 
pattern = re.compile(r"((M|A|D) /.+)") 
pattern.search(line).group() 
# 'M /trunk/src/board/ozmo.c' 

# OR 

pattern = re.compile(r"\s*((M|A|D) /.+)") 
pattern.match(line).group() 

регулярное выражение можно упростить до уровня ниже с использованием набора символов

pattern = re.compile(r"[MAD] (/.+)") 
pattern.search(line).groups()[0] 
# '/trunk/src/board/ozmo.c' 
+0

Это сработало! Я думал, что с помощью '\ s' он будет включать все вхождения пробелов перед набором символов, но мне нужно было включить' \ s * ', чтобы включить все будущие вхождения пробелов перед набором символов. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^