我正在尝试使用ls命令从文件列表中获取字符串。我有两种情况:
"filename"
"link File" -> "filename"
在python中,我执行了以下代码:
print(re.findall( r'"(.*?)"', linha))
我所做的RE:
"(.*?)" -: match ['filename'] CORRECT
['link File" -> "filename'] WRONG
"(.*?)" -> "(.*?)" -: match [''] WRONG
['link File', 'filename'] CORRECT
在同一RE中获得此结果的RE是什么?
-: match ['filename', ''] CORRECT
['link File', 'filename'] CORRECT
答案 0 :(得分:2)
您有一个可选部分,因此请使用?
进行匹配。接下来,由于目标用引号引起来,因此您要从匹配项中排除"
。这使正则表达式引擎更容易匹配您的字符串:
"([^"]*)"(?: -> "([^"]*)")?
(?:...)
分组是不可捕获的,?
分组之后是可选的。
将其与re.findall()
一起使用时,将始终得到具有两个组的元组,对于缺少-> "..."
的那些输入,第二个组为空:
>>> import re
>>> re.findall(r'"([^"]*)"(?: -> "([^"]*)")?', '"filename"')
[('filename', '')]
>>> re.findall(r'"([^"]*)"(?: -> "([^"]*)")?', '"link File" -> "filename"')
[('link File', 'filename')]
我已经创建了an online demonstration with Regex101(出于某种原因,它要求我们显式转义双引号,而不是Python实际需要的双引号)。它在“说明”标题下的右侧包含模式的细分。