2017-02-23 15 views
-1

Я очень ценю ваше время.Python pass несколько захваченных REGEX соответствует функции

Я успешно собираю текст между разделительными тегами, которые я указываю как * код *. У меня есть несколько кодов IE: * code * здесь # 1 * code *, а затем * code * коды здесь # 2 * code *. Я изо всех сил пытаюсь получить код, записанный REGEX, между маркерами * code * в мой класс для форматирования. он всегда появляется как «коды здесь # 1» снова и снова.

The input text is: 

*image1* 
Some More Text here 

That's a title pic and there are 2 more enable pictures per page. 
*code* CENTER CODES HERE *code* Those can be a bit larger. And then  there is more 
code to show *code* MORE CENTER CODE *code* 

Paragraph Test 

Вот что я захватывая текст, а затем переборе:

replace = CodeboxReplace() 
    codeboxRE = re.compile('\*code\*(.*?)\*code\*') 
    found = codeboxRE.findall(thisText) 
    for item in found: 
     thisText = codeboxRE.sub(replace(item), thisText) 

OK, а затем класс CodeboxReplace() выглядит следующим образом {CODEHERE} является тег У меня есть на месте, чтобы заменить фактический код, который был подобран между кодом разделителями:

class CodeboxReplace(object): 
def __init__(self): 
    self.counter = 0 

def __call__(self, match): 
    self.counter += 1 
    .......some not relevant code here................ 
    codeHereRE = re.compile('{CODEHERE}') 
    found = codeHereRE.findall(myCode) 
    for item in found: 
     myCode = codeHereRE.sub(match, myCode) 
    return myCode 

Так фундаментально Я хочу фрагменты кода, захваченных между т он ограничивает замену {CODEHERE}. Но каждый матч всегда использует только первый захват из REGEX.

Помощь! Благодаря!

, если вы хотите увидеть, как это оказывает посмотреть на: http://www.americantechnocracy.com/getArticle

С наилучшими пожеланиями, Том

+1

Это на самом деле не [MCVE] (https://stackoverflow.com/help/mcve). Вы опускаете части кода, которые могут показать, что вы хотите. Я думаю, вы хотите, чтобы первое совпадение '* code * (...) * code *' было захвачено и использовано для замены первого вхождения '{CODEHERE}' в другом тексте вашего класса. Это правда? –

ответ

1

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

myCode = codeHereRE.sub(match, myCode) 

заменяет все occurrances из '{CODEHERE}'. Если вы хотите, чтобы заменить 1 occurrance, а затем использовать счета параметр югу:

myCode = codeHereRE.sub(match, myCode, count=1) 
+0

СПАСИБО! Вы правильно поняли - count = 1 устраняет проблему. Мне пришлось поместить его в вызывающий re.sub, хотя ... ie: thisText = codeboxRE.sub (replace (item), thisText, count = 1) решает проблему. Размещение count = 1 в действительной функции замещения не помогает, поскольку замена нескольких тегов происходит в совпадении более высокого уровня ... но БОЛЬШАЯ БОЛЬШАЯ БОЛЬШАЯ ПОМОЩЬ СПАСИБО СКОЛЬКО –

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