Я пытаюсь разобрать код С# на 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.
Спасибо за помощь.
Я думаю, это то, что вы пытаетесь сделать; 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()
.
Ну, 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
?