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

时间:2019-04-05 07:00:32

标签: python regex

我正在尝试在另一个文件(日志文件)中搜索和捕获某种类型的文件名(例如/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)

尽管上面的文件的所有四行都应该包含上述文件的任何行,但都不匹配!

2 个答案:

答案 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))

Demo