我正在尝试在另一个文件(日志文件)中搜索和捕获某种类型的文件名(例如/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 porttitor
app.css
main.js
purus sit (amet volutpat /main.js)
尽管上面的文件的所有四行都应该包含上述文件的任何行,但都不匹配!
答案 0 :(得分:2)
将您的正则表达式更改为:
/([a-zA-Z0-9_-]+)\.(css|js)
演示:https://regex101.com/r/Aub4dw/1/
您不需要行锚的开头。它与haystack = '/main.js'
一起使用,因为/main.js
恰好在字符串的开头。
答案 1 :(得分:2)
从文件的内容可以看出,文件名不是从行首开始的,因此您需要从正则表达式中删除^
,以便它可以在文件中的任何位置匹配。您可以使用此正则表达式,
/([a-zA-Z0-9_-]+)[.](css|js)
您可以看到,在Python中,您不需要将/
换成\/
,因为/
不是正则表达式中的默认分隔符,这与某些其他语言(如JS和PHP。
此外,如果要查找文件名的所有第一部分而没有扩展名,则只需使用findall
(以防万一,请使用finditer
逐个迭代,然后使{{ 1}}这样的(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))