Python 替换字符串中的多个空格后正则表达式字符串不匹配

Python 替换字符串中的多个空格后正则表达式字符串不匹配,python,regex,string,Python,Regex,String,我试图匹配两个本质上相同的字符串,但它们之间可能有不同数量的空格 a = 'Lorem. Ipsum' b = 'Lorem. Ipsum' 我删除了它们之间的额外空格,并在匹配之前添加了转义字符 a = re.sub(r'\s+', r' ', a) a = re.escape(a) b = re.sub(r'\s+', ' ', b) b = re.escape(b) 但是,以下代码中的字符串不匹配 print(bool(re.match(b, a))) >False 我错

我试图匹配两个本质上相同的字符串,但它们之间可能有不同数量的空格

a = 'Lorem.  Ipsum'
b = 'Lorem. Ipsum'
我删除了它们之间的额外空格,并在匹配之前添加了转义字符

a = re.sub(r'\s+', r' ', a)
a = re.escape(a)

b = re.sub(r'\s+', ' ', b)
b = re.escape(b)
但是,以下代码中的字符串不匹配

print(bool(re.match(b, a)))

>False
我错过了什么

import re
a = 'Lorem.  Ipsum'
b = 'Lorem. Ipsum'

a=a.replace(" ",'')
b=b.replace(" ",'')
print(bool(re.match(b, a)))
回答是正确的

a = 'Lorem.  Ipsum'
b = 'Lorem. Ipsum'

a = re.sub(r'\s+', r' ', a) # a = Lorem. Ipsum
a = re.escape(a) # a = Lorem\\.\\ Ipsum

b = re.sub(r'\s+', ' ', b) # b = Lorem. Ipsum
b = re.escape(b) # b = Lorem\\.\\ Ipsum

bool(re.match(b, a)) # False
最后一行尝试通过正则表达式模式
b
匹配字符串
a
。编译的模式
b
将匹配字符串
Lorem。Ipsum
,但
a
的值为
“Lorem\\.\\Ipsum”
。这就是为什么它没有得到匹配并返回
False

要实现这一点,您不需要转义字符串
a
,因为它不是正则表达式


此外,我建议避免使用正则表达式检查字符串是否相等,因为它的性能比
=
差。如果您使用<代码> BoL(R.Matt(b,a))< /C>符号,检查<代码> > <代码>是否开始于<代码> b>代码>(这是如何<代码> Re.Matux/Cuth>),考虑使用函数。< /P>不要<代码> Re.Enter()/<代码>,或<代码> RE。但是,我怀疑您想要打印(a==b),只是想看看
a
b
是否相等。顺便说一句,你的标题是错误的,这不是你删除额外空间的问题。问题是您使用了固定/文字字符串作为正则表达式模式来匹配相同的字符串。@WiktorStribiżew我将实际问题简化为这种形式。在实际问题中,我将尝试检查字符串b是否在a中。至于你的解决方案,“不要重新.escape(),或者再次重新.escape这个b。”而你在链接中的解决方案是矛盾的<代码>打印(bool(re.match(re.escape(b),a))不,没有矛盾
re.escape
在字符串中引入反斜杠,空格前的反斜杠阻止它匹配<代码>洛雷姆。Ipsumregex将匹配
Lorem。Ipsum
字符串,因此当用作正则表达式模式时,不要
re.escape
任何内容,或者
re.escape
b
。此外,要检查
a
是否包含
b
,只需要
如果a
中有b。所以,
a='Lorem。Ipsum';b='Lorem。Ipsum';在re.sub(r'\s+',r'',a)中打印(re.sub(r'\s+',r'',b))
。在regex world中,您需要使用
re.search
,因为
re.match
只在字符串开头查找匹配项。