【问题标题】:Regex string not matching after replacing multiple spaces in strings替换字符串中的多个空格后,正则表达式字符串不匹配
【发布时间】:2021-04-20 14:13:34
【问题描述】:

我正在尝试匹配两个基本相同但它们之间可能有不同数量的空格的字符串。

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

我在这里错过了什么?

【问题讨论】:

  • 不要再re.escape(),或re.escapeb。但是,我怀疑您想要print(a==b),只是看看ab 是否相等。见ideone.com/W2Fv6O
  • 顺便说一句,您的标题是错误的,不是您删除了多余的空格的问题。问题是您使用固定/文字字符串作为正则表达式模式来匹配相同的字符串。
  • @WiktorStribiżew 我将实际问题简化为这种形式。在实际问题中,我会尝试检查字符串 b 是否在 a 中。至于您的解决方案,“不要重新转义(),或者重新转义b。”和您在链接中的解决方案相矛盾。 print(bool(re.match(re.escape(b), a)))
  • 不,没有矛盾。 re.escape 在字符串中引入反斜杠,空格前的反斜杠阻止它匹配。 Lorem. Ipsum 正则表达式将匹配 Lorem. Ipsum 字符串,所以要么不要 re.escape 任何东西,要么 re.escape b 当用作正则表达式模式时。
  • 另外,要检查a 是否包含b,您只需要if b in a。所以,a = 'Lorem. Ipsum'; b = 'Lorem. Ipsum'; print( re.sub(r'\s+', r' ', b) in re.sub(r'\s+', r' ', a) )。在正则表达式世界中,您需要使用re.search,因为re.match 只在字符串开头查找匹配项。

标签: python regex string


【解决方案1】:
import re
a = 'Lorem.  Ipsum'
b = 'Lorem. Ipsum'

a=a.replace(" ",'')
b=b.replace(" ",'')
print(bool(re.match(b, a)))

回答是真的

【讨论】:

    【解决方案2】:
    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,因为它不是正则表达式。

    另外,我建议避免使用正则表达式来检查字符串是否相等,因为它的性能会比== 更差。如果您使用bool(re.match(b, a)) 表示法来检查a 是否以b 开头(这就是re.match works 的方式),请考虑使用startswith 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2015-11-30
      • 2014-10-08
      • 2013-10-24
      相关资源
      最近更新 更多