Эквивалент из C # matchObject.Value в Python?

1

Я пытаюсь разобрать код С# на Python. В этом коде есть несколько регулярных выражений. Пока все работает нормально, но теперь у меня есть следующая проблема:

Код С#:

Match m = regEx.Match( Expression );
while( m.Success )
{
    Expression = Expression.Replace( m.Value, m.Groups[1].Value + this.Solve( m.Groups[2].Value ) );
}

Что я могу сделать, чтобы этот код работал в python? Я уже пробовал что-то вроде этого:

matchObj = re.search(pattern = p, string = expression, flags = re.IGNORECASE)
while matchObj:
    if len(matchObj.group(3)) > 0:
        expression = re.sub(pattern = p, repl = matchObj.group(1) + self.solve(matchObj.group(2)), string = matchObj.string, flags = re.IGNORECASE) #Here is the problem...

Так что на самом деле я ищу что-то эквивалентное matchObject.Value.

Спасибо за помощь.

Теги:

2 ответа

1
Лучший ответ

Я думаю, это то, что вы пытаетесь сделать; match.group() (без параметра) возвращает соответствие всем регулярным выражениям:

m = re.search( pattern, text )
if m and len( m.group(3) ) > 3:
    text = text.replace( m.group(), m.group(1) + solve( m.group(2) ) )

Я не знаю, почему у вас там петля, поэтому я удалил ее. Другой способ, без использования str.replace, - манипулировать строкой на основе позиций, возвращаемых m.start() и m.end().

  • 0
    Вот и все. После отладки кода C # и кода Python я смог сам это выяснить. Спасибо за Ваш ответ.
0

Ну, re.search возвращает объект Match в python. Из документов:

Сканирование по строке, ищущей место, где это регулярное выражение создает совпадение, и возвращает соответствующий экземпляр MatchObject. Возврат Нет, если никакая позиция в строке не соответствует шаблону; обратите внимание, что это отличается от поиска совпадения нулевой длины в некоторой точке строки.

Чтобы получить всю согласованную строку из Python MatchObject, используйте group метод. matchObj.group() или matchObj.group(0) вернет всю согласованную строку, а matchObj.group(1) вернет первую согласованную группу и т.д. Это очень похоже на С# Match.

Теперь о вашем коде на С#... Разве это не бесконечный цикл? m.Success всегда вернет true и m.Value всегда даст вам тот же результат. Метод Match только соответствует первому появлению регулярного выражения. Возможно, вам MatchCollection использовать метод " Matches, который возвращает MatchCollection? Или метод Solve который вы вызываете взамен, фактически обновляет значение m?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню