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

#c# #python #regex

#c# #python #регулярное выражение

Вопрос:

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

C # Код:

 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.

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

Ответ №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() .

Комментарии:

1. Это было все. После отладки кода C # и кода Python я смог найти это сам. Спасибо за ваш ответ.

Ответ №2:

Что ж, re.search возвращает объект соответствия в python. Из документов:

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

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

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