我正在嘗試/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
提交
取消