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

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

它与上述文件的任何行都不匹配,即使它应该在所有四行中都有!


鸿蒙传说
浏览 382回答 2
2回答

尚方宝剑之说

从您的文件内容可以看出,文件名不是从行首开始,因此您需要^从正则表达式中删除,以便它可以匹配文件中的任何位置。你可以使用这个正则表达式,/([a-zA-Z0-9_-]+)[.](css|js)正如您所看到的,在 Python 中您不需要转义 a /as\/因为/它不是正则表达式中的默认分隔符,这与其他一些语言(如 JS 和 PHP)不同。另外,如果您想找到没有扩展名的所有文件名的第一部分,只需使用findall(如果这对您更好)而不是使用此代码一个一个地迭代finditer并使用此代码创建(css|js)一个非组(?:css|js),import res = '''duis ut diam quam /app.css porttitorapp.cssmain.jspurus sit (amet volutpat /main.js)'''print(re.findall(r'/([a-zA-Z0-9_-]+)[.](?:css|js)', s))印刷,['app', 'main']

慕桂英3389331

将您的正则表达式更改为:/([a-zA-Z0-9_-]+)\.(css|js)演示:https : //regex101.com/r/Aub4dw/1/您不需要行锚的开头。它适用于haystack = '/main.js'因为/main.js恰好在字符串的开头。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python