2015-09-29 3 views
0

Я пытаюсь написать крошечный скрипт python для локализации файлов исходного кода.Python regex get string между кавычками

В исходных файлах есть некоторые строки, такие как этот:

title: "Warning".localized() 

То, что я пытаюсь сделать, это извлечения строки между кавычки всякий раз, когда я нахожу .localized() прилагается.

Регулярное выражение для сопоставления этой строки является: regex = re.compile('([^"]*).localized\(\)', re.DOTALL)

Совпадение работает, потому что я получаю следующий результат:

... 
./testproject/test1.swift 
.localized() 
.localized() 
./testproject/test2.swift 
... 

Но то, что я не получаю строку между кавычками.

Питон скрипт:

import os, re, subprocess 
import fnmatch 

def fetch_files_recursive(directory, extension): 
matches = [] 
for root, dirnames, filenames in os.walk(directory): 
    for filename in fnmatch.filter(filenames, '*' + extension): 
     matches.append(os.path.join(root, filename)) 
return matches 

regex = re.compile('([^"]*).localized\(\)', re.DOTALL) 

for file in fetch_files_recursive('.', '.swift'): 
print file 
with open(file, 'r') as f: 
    content = f.read() 
    # e.g. "Warning".localized(), 
    for result in regex.finditer(content): 
     print result.group(0) // output = '.localized()' 
     print result.group(1) // output = '' empty :-(
+2

Регулярное выражение должно быть, вероятно, больше, как '/ "([^"] +)" \ локализованы \ (\)/'Вы не позволяя для' «' между «Предупреждением» и «.локализованным». И поскольку вы используете звездочку, группа 1 будет пустой. – Biffen

+2

Попробуйте: regex = re.compile (r '"([^"] *) "\. Localized \ (\)')' и использовать захваченную группу # 1 – anubhava

+0

Также для дальнейшего использования этот сайт отлично подходит для тестирования Python regex: http://pythex.org – idjaw

ответ

0

Преобразование мой комментарий в ответ.

Вы можете использовать этот шаблон:

regex = re.compile(r'"([^"]*)"\.localized\(\)') 

и использовать захваченные группы # 1. [^"]* соответствует 0 или более символов, которые не являются двойной котировкой.

Или используя обходные:..

regex = re.compile(r'(?<=")([^"]*)"(?="\.localized\(\)')) 
Смежные вопросы