为了账号安全,请及时绑定邮箱和手机立即绑定

python - 正则表达式仅适用于单个单词

python - 正则表达式仅适用于单个单词

鸿蒙传说 2021-12-29 20:04:31
我正在尝试/app.css /main.js在另一个文件(日志文件)中搜索和捕获某种类型的文件名(例如)。我构建的正则表达式是这样的:^\/([a-zA-Z0-9_-]+)[.](css|js)我正在尝试获取第一个捕获组,即没有扩展名的文件名(app main上面示例中的等),这就是我的搜索方式haystack = '/main.js'matches = re.finditer(pattern, haystack, re.MULTILINE)它工作正常,我能够获得捕获的组。但是,如果我在读取文件时执行相同操作,则不起作用pattern = r"'^\/([a-zA-Z0-9_-]+)[.](css|js)'"for i, line in enumerate(open('log.txt', 'r')):    haystack = line.rstrip()    matches = re.finditer(pattern, haystack, re.MULTILINE)的内容log.txt是这样的:duis ut diam quam /app.css porttitorapp.cssmain.jspurus sit (amet volutpat /main.js)它与上述文件的任何行都不匹配,即使它应该在所有四行中都有!
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

从您的文件内容可以看出,文件名不是从行首开始,因此您需要^从正则表达式中删除,以便它可以匹配文件中的任何位置。你可以使用这个正则表达式,


/([a-zA-Z0-9_-]+)[.](css|js)

正如您所看到的,在 Python 中您不需要转义 a /as\/因为/它不是正则表达式中的默认分隔符,这与其他一些语言(如 JS 和 PHP)不同。


另外,如果您想找到没有扩展名的所有文件名的第一部分,只需使用findall(如果这对您更好)而不是使用此代码一个一个地迭代finditer并使用此代码创建(css|js)一个非组(?:css|js),


import re


s = '''duis ut diam quam /app.css porttitor

app.css

main.js

purus sit (amet volutpat /main.js)'''


print(re.findall(r'/([a-zA-Z0-9_-]+)[.](?:css|js)', s))

印刷,


['app', 'main']


查看完整回答
反对 回复 2021-12-29
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

将您的正则表达式更改为:

/([a-zA-Z0-9_-]+)\.(css|js)

演示:https : //regex101.com/r/Aub4dw/1/

您不需要行锚的开头。它适用于haystack = '/main.js'因为/main.js恰好在字符串的开头。


查看完整回答
反对 回复 2021-12-29
  • 2 回答
  • 0 关注
  • 324 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号