2015-05-15 5 views
0

У меня есть простое регулярное выражение для разбора файлов исходного кода и для каждой строки извлечь содержимое, заключенное в двойные кавычки, чтобы использовать в gettext.po файлеRegex не соответствует шаблону между кавычками?

Вот мое регулярное выражение:

gettext_subject = re.compile(r"""[subject: |summary: ]\"(.*?)\"""").findall 

Вот образец входного файла:

exports.onAppointment = (appt, user, lang, isNew) -> 
    if not user then return Promise.reject "Appointment has no user." 
    moment.locale(lang) 
    start = moment(appt.when) 
    cal = new ICal() 
    console.log appt.when 
    cal.addEvent 
    start: start.toDate() 
    end: moment(start).add(2,"hours").toDate() 
    summary: "Continental showroom visit" 
    mail = 
    to: user.emailId 
    subject: if isNew then "New appointment" else "Appointment updated" 
    alternatives: [ 
     contentType: "text/calendar", 
     contents: new Buffer(cal.toString()), 
     contentEncoding: "7bit" 
     ] 
    template = 
    name: "booking" 
    lang: lang 
    locals: 
     name: "#{user.firstName} #{user.lastName}" 
     datetime: moment(appt.when).format("dddd Do MMMM [at] HH:mm A") 
     cancelurl: config.server.baseUrl + "/appointment/cancel/#{appt._id}" 
    emailClient.send2 mail, template 

Этот код работает правильно:

gettext_subject = re.compile(r"""subject: \"(.*?)\"""").findall 

и тестирования из командной строки также возвращает, правильный ответ

$ python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import re 
>>> gettext = re.compile(r"""[subject: |summary: ]\"(.*?)\"""").findall 
>>> pattern = """subject: \"blah blah blah\"\nsummary: \"summary text\"\nsubject: \"second subject line\"\nsummary: if isNew then \"New appointment\" else \"Appointment updated\"\n""" 
>>> print gettext(pattern) 
['blah blah blah', 'summary text', 'second subject line', 'New appointment', 'Appointment updated'] 
>>> 

, но когда я запускаю его через мой код это не работает, вот код:

import os 
import sys 
import re 
from operator import itemgetter 

walk_dir = ["app", "email", "views"] 
#t=(" ") 
gettext_messages = re.compile(r"""\"(.*)\"""", re.MULTILINE).findall 
gettext_re = re.compile(r"""[=|#|{]t\(\"(.*?)\"""").findall 
gettext_subject = re.compile(r"""[subject: |summary: ]\"(.*?)\"""").findall 

gettext = [] 
for x in walk_dir: 
    curr_dir = "../node-blade-boiler-template/" + x 
    for root, dirs, files in os.walk(curr_dir, topdown=False): 
     if ".git" in dirs: 
      dirs.remove(".git") 
     if "node-modules" in dirs: 
      dirs.remove("node-modules") 
     if "models" in dirs: 
      dirs.remove("models") 

     for filename in files: 
      file_path = os.path.join(root, filename) 
      #print('\n- file %s (full path: %s)' % (filename, file_path)) 
      with open(file_path, 'rb') as f: 
       f_content = f.read() 
       if 'messages.coffee' == filename: 
        #pass 
        msgids = gettext_messages(f_content) 
       elif 'map.coffee' == filename: 
        pass 
       elif 'emailtrigger.coffee' == filename: 
        #print f_content 
        if 'subject: ' in f_content: 
         print gettext_subject(f_content) 
         msgids = gettext_subject(f_content) 

       else: 
        msgids = gettext_re(f_content) 
       for msgid in msgids: 
        msgid = '"' + msgid + '"' 
        #print msgid 
        dic = { 
        'path' : file_path, 
        'msgid' : "%s" % msgid 
        } 
        gettext.append(dic) 

Какой совет много оценили.

+0

Просто любопытно: что, если вы используете 'gettext_subject = re.compile (г "(я) (?: предмет: |? Резюме:) \".? (*) \ ""). FindAll '? –

ответ

1
(?:Subject:|Summary:)[^"]*"(.*?)" 

Вы можете попробовать это. Смотрите демоверсию. [] - это не то, что вы думаете. Его характерный класс. [subject] будет соответствовать subject, tcejubs любых символов в любом порядке.

См. Демонстрационную версию.

https://regex101.com/r/mT0iE7/33#python

+0

Любая причина, по которой вы говорите, что компиляции нет необходимости? – Jerry

+1

Вы понимаете, что OP использует регулярное выражение в * трехколесных циклах, так что потенциально регулярное выражение используется много раз? – Jerry

+0

@ Джерри ахх проверил код. Прямо !!! его лучше использовать скомпилированную версию здесь – vks

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