我正在尝试/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']

慕桂英3389331
TA贡献2036条经验 获得超8个赞
将您的正则表达式更改为:
/([a-zA-Z0-9_-]+)\.(css|js)
演示:https : //regex101.com/r/Aub4dw/1/
您不需要行锚的开头。它适用于haystack = '/main.js'
因为/main.js
恰好在字符串的开头。
添加回答
举报
0/150
提交
取消