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

标签 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)

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

最佳答案

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

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

如您所见,在 Python 中您不需要转义 /作为\/因为/与 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']

Demo

关于python - 正则表达式仅适用于单个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55529850/

相关文章:

javascript - 我如何从 html 表单获取输入并将其添加到 python 脚本中

python - Django:快速检索 manyToMany 字段的 ID

ruby - 将字符串转换为正则表达式 ruby

java - 如何通过在java中传递相对路径来获取文件?

regex - 用于匹配指定路径级别的页面 URI 的 Google Analytics 正则表达式

python - 创建新的 "object"列

python - 我从哪里开始学习对机器人进行编程?

python - 将带有时间增量的 Pandas 数据框写入 Parquet

sql - Oracle - Regexp_Like 中的子查询

python - .* 与 ^ 的非贪婪匹配