有人可以向我解释这个正则表达式中发生了什么吗? (蟒蛇)

时间:2015-11-15 01:36:16

标签: python regex

s = "hi mom, *please* send more *money*, luv!"
p = r"\*([^\*]+)\*"

print( "s = '", s, "'", sep = "" )
s = re.sub( p, r"<em>\1</em>", s )
print( "s = '", s, "'", sep = "" )

输出是:

s = 'hi mom, *please* send more *money*, luv!'

s = 'hi mom, <em>please</em> send more <em>money</em>, luv!'

而我真的不明白发生了什么。我想我明白了 p = r"\*([^\*]+)\*",r表示原始字符串,当存在此r前缀时,“字符串中包含后备字符的字符不会发生变化。”好的,到目前为止一切顺利。因此p中的第一个和最后一个*将被转义,这意味着它们将包含在字符串中。我明白了。我知道()中的括号用于匹配,但也用于指示组的开始和结束。我还假设s = re.sub(p , r"<em>\1</em>", s)中的“1”与某个组有关。但是......我不知道,只是不是所有人都在一起而且我真的不明白我们如何得到第二根弦。有人喜欢......通过这个来告诉我吗?

2 个答案:

答案 0 :(得分:0)

*是正则表达式中的一个特殊字符,因此r"\*"正在为引擎转义*,以便它知道它正在寻找文字*

[^\*]+表示一个或多个不是文字明星的字符

\1指的是捕获组(括号之间的任何内容)

https://www.debuggex.com/r/tety3IA93jSB1iah演示正则表达式匹配..深色突出显示是捕获组内匹配的内容

答案 1 :(得分:0)

p = r"\*([^\*]+)\*"

这意味着在两个*之间,匹配一个或多个不是(^)a *

的字符
  

如果集合的第一个字符是'^',则表示所有字符   不在集合中将匹配。例如,[^ 5]将匹配任何   字符除了'5',而[^^]将匹配除'^'之外的任何字符。   Source: Python Documentation

s = re.sub( p, r"<em>\1</em>", s )

将&lt; em&gt; Group 1&lt; / em&gt;替换为匹配的字符串,即* please *。第1组是()之间捕获的所有东西。请&amp;钱。在正则表达式中只有一个组,如果有多个组,则使用\ 2来获取第二组的内容,依此类推。