python - 在正则表达式中,如何匹配字符串的两种不同情况

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

最佳答案

您有一个可选部分,因此如果存在,请使用 ? 来匹配它。接下来,您希望从匹配中排除 ",因为您的目标被引号包围。这使得正则表达式引擎更容易匹配您的字符串:

"([^"]*)"(?: -> "([^"]*)")?

(?:...) 分组是非捕获的,? 使其成为可选。

当您将其与 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/

相关文章:

python - C+ +'s "a = f++;"的 Python 等价物是什么?

python - 在 Python 中是否可以在 RETURN 语句之后制作一个包含多个 IF 和 OR 的单行代码?

java - 如何控制 Java 正则表达式中的迭代步骤?

JavaScript 正则表达式

JavaScript 正则表达式 - 如何用标签包装匹配项?

php ltrim 破坏正则表达式?

python - 创建派系图以确定独立集

python - 在 Jupyter Notebook 中使用 PyQ

java - 在字符串中查找 JSON 对象

python - 如何异步使用 Tornado 和 Redis?