Python中的正则表达式不匹配字符串的结尾

时间:2012-08-29 23:17:16

标签: python regex

我只是学习Python,我似乎无法弄清楚正则表达式。

r1 = re.compile("$.pdf")
if r1.match("spam.pdf"):
    print 'yes'
else:
    print 'no'

我希望这段代码打印出“是”,但它会顽固地打印“否”。我也尝试过以下各项:

r1 = re.compile(r"$.pdf")

r1 = re.compile("$ .pdf")

r1 = re.compile('$.pdf')

if re.match("$.pdf", "spam.pdf")

r1 = re.compile(".pdf")

加上无数其他变种。我已经搜索了很长一段时间,但无法找到/理解解决我问题的任何事情。有人可以帮助新手吗?

5 个答案:

答案 0 :(得分:30)

除了有效的变种之外,你已尝试过所有变体。 $位于模式的 end 。此外,你想要逃避期间,因此它实际上匹配一个句号(通常它匹配任何字符)。

r1 = re.compile(r"\.pdf$")

然而,更简单,更清晰的方法是使用字符串的.endswith()方法:

if filename.endswith(".pdf"):
    # do something

通过这种方式,您无需破译正则表达式即可了解正在发生的事情。

答案 1 :(得分:13)

re.match()re.search()

的行为

有一个显着差异:re.match()检查字符串的开头,您很可能正在寻找re.search()

这两种方法的比较清楚地显示在名为“search() vs. match()

的Python文档章节中

正则表达式中的特殊字符

正则表达式中字符的含义与您尝试使用它时的含义不同(有关详细信息,请参阅Regular Expression Syntax):

  • ^与开头匹配:

      

    (Caret。)匹配字符串的开头,并且在MULTILINE模式下也会在每个换行符后立即匹配。

  • $匹配结尾:

      

    匹配字符串的结尾或字符串末尾的换行符之前,并且MULTILINE模式也匹配换行符之前。 foo匹配“foo”和“foobar”,而正则表达式foo$仅匹配“foo”。更有趣的是,在'foo1 \ nfoo2 \ n'中搜索foo。$'通常匹配'foo2',但在foo1模式下匹配'MULTILINE';在“$”中搜索单个foo\n会找到两个(空)匹配:一个位于换行符之前,另一个位于换行符的末尾。

完整答案

您正在寻找的解决方案可能是:

import re
r1 = re.compile("\.pdf$")  # regular expression corrected
if r1.search("spam.pdf"):  # re.match() replaced with re.search()
    print "yes"
else:
    print "no"
如果字符串以“.pdf”结尾,则检查

。和kindall的答案一样.endswith(),但是如果kindall的答案适合你,那就选择它(它更干净,因为你可能根本不需要正则表达式)。

答案 2 :(得分:7)

您的问题

$表示“字符串结束”。因此,您需要像\.pdf$这样的正则表达式来匹配:

  1. 点(.),因为它是正则表达式中的特殊字符而被转义。
  2. 字符串“pdf
  3. 字符串结束。
  4. 进一步阅读

    正则表达式超越了语言,Python或其他语言,因此您应首先阅读有关它们的一些教程。考虑regular-expressions.info。这实际上不是Python问题,它是一个基本的正则表达式问题。

答案 3 :(得分:1)

正则表达式$.pdf说“找到字符串的结尾,然后找到任何字符,超出字符串末尾之外的任何字符,找到p,a和f”。

如上所述,它无法合理地匹配任何东西。

但是,pdf$会匹配。

在这种特定情况下,你可能还想做一个search而不是match,因为我相信匹配固有地锚定在字符串的开头。

答案 4 :(得分:1)

我看到了两个快速的选择:

  • *_like(x)

    使用此解决方案,我们必须指明我们不关心字符串的开始方式。但我们不能在开头省略表达。 使用re.match(pattern='.*pdf$', string='filename.pdf')时,您必须确保为整个字符串提供有效的正则表达式,即索引0见https://docs.python.org/3/howto/regex.html#match-versus-search

  • re.match()

    我们不关心字符串是如何开始的,我们只是搜索以扩展名结尾的字符串

回答已被接受,但我个人需要检查官方文档,以便明确。