Python sub(';a*|b';&';';';bcd';)->;bcd WAT?
今天我在regexp-matching中偶然发现了一个奇怪的行为。我无法解释,尽管我认为我对正则表达式很有经验Python sub(';a*|b';&';';';bcd';)->;bcd WAT?,python,regex,Python,Regex,今天我在regexp-matching中偶然发现了一个奇怪的行为。我无法解释,尽管我认为我对正则表达式很有经验 print re.sub('a*|b', '', 'bcd') 卡介苗 哪里没有地球仪 print re.sub('a|b', '', 'bcd') 光盘 这是意料之中的 我以为失败的选择不会阻止尝试其他选择 a*始终匹配(零到无限个a字符) 因此,您最终在匹配的位置将一个'替换为bcd 所以整个字符串返回 从: re.sub(模式、应答、字符串、计数=0、标志=0) 返回通
print re.sub('a*|b', '', 'bcd')
卡介苗
哪里没有地球仪
print re.sub('a|b', '', 'bcd')
光盘
这是意料之中的我以为失败的选择不会阻止尝试其他选择
a*
始终匹配(零到无限个a
字符)
因此,您最终在匹配的位置将一个'
替换为bcd
所以整个字符串返回
从: re.sub(模式、应答、字符串、计数=0、标志=0) 返回通过替换repl替换字符串中模式最左侧不重叠的出现而获得的字符串
因此,
'
字符串的开头是零a
s的出现,并被repl
a*
替换为始终匹配的(零到无限个a
字符)
因此,您最终在匹配的位置将一个'
替换为bcd
所以整个字符串返回
从: re.sub(模式、应答、字符串、计数=0、标志=0) 返回通过替换repl替换字符串中模式最左侧不重叠的出现而获得的字符串
因此,
'
字符串的开头是零a
s的出现,并被repl
替换……因此甚至不考虑b,因为前面的a*匹配零次?@YuryPaykov-正确。它实际上取决于正则表达式引擎实现是否被评估/考虑,但第一个匹配项是a*
。答案很好。我只想补充一点,通过使用您可以看到的替换字符串,而不是空字符串,例如re.sub('a*|b','replaced','bcd')
,这些问题通常更容易调试。这表明比赛的第一部分没有失败。我仍然不知道为什么替补没有通过<当count
为零时,code>re.sub假定为模式的所有非重叠出现。例如,re.sub('a | b','*','abcdab')
产生**cd**
。为什么b
之前的零宽度匹配被认为与b
重叠?…因此甚至不考虑b,因为前面的a*匹配零次?@YuryPaykov-正确。它实际上取决于正则表达式引擎实现是否被评估/考虑,但第一个匹配项是a*
。答案很好。我只想补充一点,通过使用您可以看到的替换字符串,而不是空字符串,例如re.sub('a*|b','replaced','bcd')
,这些问题通常更容易调试。这表明比赛的第一部分没有失败。我仍然不知道为什么替补没有通过<当count
为零时,code>re.sub假定为模式的所有非重叠出现。例如,re.sub('a | b','*','abcdab')
产生**cd**
。为什么b
之前的零宽度匹配被认为与b
重叠?看起来您需要的是+
量词,而不是*
。试试re.sub('a+|b',''bcd')
看起来你想要一个+
量词而不是*
。尝试re.sub('a+|b','bcd')