我正在尝试使用 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
最佳答案
您有一个可选部分,因此如果存在,请使用 ?
来匹配它。接下来,您希望从匹配中排除 "
,因为您的目标被引号包围。这使得正则表达式引擎更容易匹配您的字符串:
"([^"]*)"(?: -> "([^"]*)")?
(?:...)
分组是非捕获的,?
使其成为可选。
当您将其与 re.findall()
一起使用时,您将始终获得具有两组的元组,对于 -> "..."的输入,第二组为空。缺少
:
>>> import re
>>> re.findall(r'"([^"]*)"(?: -> "([^"]*)")?', '"filename"')
[('filename', '')]
>>> re.findall(r'"([^"]*)"(?: -> "([^"]*)")?', '"link File" -> "filename"')
[('link File', 'filename')]
我创建了an online demonstration with Regex101 (出于某种原因,这要求我们显式转义双引号,而不是 Python 实际需要的)。它包含右侧“解释”横幅下的模式分割。
关于python - 在正则表达式中,如何匹配字符串的两种不同情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54378998/