Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sub(';a*|b';&';';';bcd';)->;bcd WAT?_Python_Regex - Fatal编程技术网

Python sub(';a*|b';&';';';bcd';)->;bcd WAT?

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) 返回通

今天我在regexp-matching中偶然发现了一个奇怪的行为。我无法解释,尽管我认为我对正则表达式很有经验

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')