我只是学习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")
加上无数其他变种。我已经搜索了很长一段时间,但无法找到/理解解决我问题的任何事情。有人可以帮助新手吗?
答案 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$
这样的正则表达式来匹配:
.
),因为它是正则表达式中的特殊字符而被转义。pdf
”正则表达式超越了语言,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()
我们不关心字符串是如何开始的,我们只是搜索以扩展名结尾的字符串