我只是在学习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)
这样您就不必破译正则表达式来理解正在发生的事情.
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的答案适合你,请选择它(它更干净,因为你可能根本不需要正则表达式).
$意思是"字符串的结尾".所以,你需要一个\.pdf$匹配的正则表达式:
.),因为它是正则表达式中的特殊字符而被转义.pdf"正则表达式超越了语言,Python或其他语言,因此您应首先阅读有关它们的一些教程.考虑regular-expressions.info.这实际上不是Python问题,它是一个基本的正则表达式问题.