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

use*_*426 7 python regex

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

r1 = re.compile("$.pdf")
if r1.match("spam.pdf"):
    print 'yes'
else:
    print 'no'
Run Code Online (Sandbox Code Playgroud)

我想要这个代码打印'是',但它顽固地打印'不'.我也尝试过以下各项:

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

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

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

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

r1 = re.compile(".pdf")
Run Code Online (Sandbox Code Playgroud)

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

kin*_*all 34

除了工作之外,您已尝试过所有变体.在$去在年底的格局.此外,您将要逃避期间,因此它实际上匹配一个句点(通常它匹配任何字符).

r1 = re.compile(r"\.pdf$")
Run Code Online (Sandbox Code Playgroud)

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

if filename.endswith(".pdf"):
    # do something
Run Code Online (Sandbox Code Playgroud)

这样您就不必破译正则表达式来理解正在发生的事情.

  • 您可能正在使用`.match()`来检查它是否匹配.你想要`.search()`因为`.match()`只检查字符串的开头. (5认同)
  • 这已经很晚了(抱歉错过了) `.endswith()` 接受一个字符串元组来匹配所提供的任何字符串。`filename.endswith((".html", ".css", ".js"))` (2认同)

Tad*_*eck 16

re.match()和的行为re.search()

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

两个方法的比较清楚地显示在Python文档章节" search()vs. match() "中

正则表达式中的特殊字符

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

  • ^ 匹配开头:

    (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"
Run Code Online (Sandbox Code Playgroud)

如果字符串以" .pdf" 结尾,则检查.与kindall的答案相同.endswith(),但如果kindall的答案适合你,请选择它(它更干净,因为你可能根本不需要正则表达式).


mmd*_*bas 7

你的问题

$意思是"字符串的结尾".所以,你需要一个\.pdf$匹配的正则表达式:

  1. 一个点(.),因为它是正则表达式中的特殊字符而被转义.
  2. 字符串" pdf"
  3. 字符串结束.

进一步阅读

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