Регулярные выражения в скрипте Python для поиска и замены?Обновить - PullRequest
3 голосов
/ 14 июня 2010

Я новичок в написании скриптов на Python, поэтому, пожалуйста, простите меня заранее, если ответ на этот вопрос кажется очевидным.

Я пытаюсь собрать масштабный скрипт поиска и замены с использованием Python. Я использую код, подобный следующему:

infile = sys.argv[1]
charenc = sys.argv[2]
outFile=infile+'.output'

findreplace = [
('term1', 'term2'),
]

inF = open(infile,'rb')
s=unicode(inF.read(),charenc)
inF.close()

for couple in findreplace:
    outtext=s.replace(couple[0],couple[1])
    s=outtext

outF = open(outFile,'wb')
outF.write(outtext.encode('utf-8'))
outF.close()

Как мне заставить скрипт выполнять поиск и замену регулярных выражений?

В частности, я хочу, чтобы он нашел некоторую информацию (метаданные), указанную в верхней части текстового файла. Например:

Title: This is the title
Author: This is the author
Date: This is the date

и преобразовать его в формат LaTeX. Например:

\title{This is the title}
\author{This is the author}
\date{This is the date}

Может быть, я решаю это неправильно. Если есть способ лучше регулярных выражений, пожалуйста, дайте мне знать!

Спасибо!

Обновление: Спасибо за размещение примера кода в ваших ответах! Я могу заставить его работать, пока я заменяю действие findreplace, но я не могу заставить оба работать. Проблема в том, что я не могу правильно интегрировать ее в полученный код. Как бы я сделал, чтобы скрипт выполнял несколько действий над 'outtext' в приведенном ниже фрагменте?

for couple in findreplace:
    outtext=s.replace(couple[0],couple[1])
    s=outtext

Ответы [ 4 ]

5 голосов
/ 14 июня 2010
>>> import re
>>> s = """Title: This is the title
... Author: This is the author
... Date: This is the date"""
>>> p = re.compile(r'^(\w+):\s*(.+)$', re.M)
>>> print p.sub(r'\\\1{\2}', s)
\Title{This is the title}
\Author{This is the author}
\Date{This is the date}

Чтобы изменить регистр, используйте функцию как параметр замены:

def repl_cb(m):
    return "\\%s{%s}" %(m.group(1).lower(), m.group(2))

p = re.compile(r'^(\w+):\s*(.+)$', re.M)
print p.sub(repl_cb, s)

\title{This is the title}
\author{This is the author}
\date{This is the date}

1 голос
/ 14 июня 2010
0 голосов
/ 14 июня 2010
>>> import re
>>> m = 'title', 'author', 'date'
>>> s = """Title: This is the title
Author: This is the author
Date: This is the date"""
>>> for i in m:
    s = re.compile(i+': (.*)', re.I).sub(r'\\' + i + r'{\1}', s)


>>> print(s)
\title{This is the title}
\author{This is the author}
\date{This is the date}
0 голосов
/ 14 июня 2010

Регулярное выражение, которое вы хотите, вероятно, будет выглядеть следующим образом:

^([^:]+): (.*)

, а выражение замены будет

\\\1{\2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...