在正则表达式中,如何匹配两个不同的字符串

时间:2019-01-26 13:51:14

标签: python regex

我正在尝试使用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

1 个答案:

答案 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实际需要的双引号)。它在“说明”标题下的右侧包含模式的细分。