2013-05-13 2 views
1

Так что у меня это:Regex многострочного заменить

z='===hello 
there===, 
how are ===you===?' 

И я хочу быть:

z='<b>hello 
there<\b>, 
how are <b>you<\b>?' 

Я попытался сделать это:

z = re.sub(r"\={3}([^\$]+)\={3}", r"<b> \\1 </b>", z, re.M) 

И это работает вроде, но я получил это вместо:

z='<b>hello 
there===, 
how are ===you<\b>?' 

Я все еще новичок в этом, но я считаю, что это ^ и $, что делает его совпадающим с началом и концом строки. Итак, как мне изменить его, чтобы он соответствовал тем, что посередине?

+0

Используйте 4 пробела или - для отступа кода – jamylak

ответ

2
re.sub(r"\={3}([^\$]+?)\={3}", r"<b> \\1 </b>", z, re.M) 

Копирование из питона док :

*?, +?, ?? The '*', '+', and '?' qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn’t desired; if the RE <.*> is matched against '<H1>title</H1>', it will match the entire string, and not just '<H1>'. Adding '?' after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using .*? in the previous expression will match only '<H1>'.

+2

Пожалуйста, объясните, почему это устраняет проблему Ops, так что он знает, в будущее. (Это потому, что +? Ленив и соответствует как можно меньше символов, поэтому он останавливается при первом '<\b>' не последний '<\b>') – Patashu

+0

О, я вижу. И это сработало! Это также зафиксировало еще одну проблему, которую я так поблагодарил! – user2270501

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