#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
?