В регулярном выражении, как сопоставить два разных случая строки - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь получить строки из списка файлов с помощью команды 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 голосов
/ 26 января 2019

У вас есть дополнительный раздел, поэтому используйте ?, чтобы сопоставить его, если он есть.Затем вы хотите исключить " из ваших матчей, так как ваши цели окружены кавычками.Это облегчает для движка регулярных выражений совпадение с вашей строкой:

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

Группировка (?:...) не захватывает, ? после того, как делает ее необязательной.

Когда выиспользуйте это с re.findall(), вы всегда будете получать кортежи с двумя группами, вторая будет пустой для тех входов, где отсутствует -> "...":

>>> import re
>>> re.findall(r'"([^"]*)"(?: -> "([^"]*)")?', '"filename"')
[('filename', '')]
>>> re.findall(r'"([^"]*)"(?: -> "([^"]*)")?', '"link File" -> "filename"')
[('link File', 'filename')]

Я создал онлайндемонстрация с использованием Regex101 (которая по какой-то причине требует, чтобы мы явно экранировали двойные кавычки, а не то, что фактически требовал бы Python).В правой части под баннером «Объяснение» содержится разбивка рисунка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...