#python #regex
Вопрос:
Не удалось извлечь элемент между специальным символом =
и amp;
с помощью следующего кода
import re
tags = ["letter1=Aamp;letter2=Bamp;letter3=C",
"letter1=Damp;letter2=Eamp;letter3=F"]
pat=r"^.*='(.*)'amp;.*$"
result = re.search(pat, tags [0])
Возврат empty
.
Но я ожидаю выхода, как показано ниже
выход
A B C
Комментарии:
1. В вашем регулярном выражении есть
'
группа захвата, но в строках нет кавычекtags
.2. Кроме того, вам нужно использовать не жадный квантор,
.*?
3. Почему вы используете регулярное выражение, нет ли библиотеки для анализа строк URL-запросов?
4. Тебе не нужно убегать
=
илиamp;
. И ваш шаблон будет соответствовать только одному из элементов, а не всем, потому что он привязан к началу и концу.5. Спасибо за вклад @Barmar
Ответ №1:
Для ожидаемого результата найдите букву после =
знака с одним или без amp;
в конце:
>>> re.findall('=(w)[amp;]{0,1}', tags[0])
#output
['A', 'B', 'C']
Комментарии:
1. Привет @Dont, могу я узнать значение прилагаемого 0,1 ? Спасибо
2.
[amp;]{0,1}
Это означает, что их может быть либо нетamp;
, либо ровно одинamp;
. Числа внутри{
}
определяют количество повторений, с которыми вы можете ознакомиться в документации.
Ответ №2:
код:
import re
tags = [
"letter1=Aamp;letter2=Bamp;letter3=C",
"letter1=Damp;letter2=Eamp;letter3=F"
]
pat=re.compile("(w )=(w )")
for tag in tags:
print(pat.findall(tag))
выход:
[('letter1', 'A'), ('letter2', 'B'), ('letter3', 'C')]
[('letter1', 'D'), ('letter2', 'E'), ('letter3', 'F')]
Ответ №3:
Чтобы действительно получить свой ответ, вы можете просто использовать split
:
from itertools import chain
tags = ["letter1=Aamp;letter2=Bamp;letter3=C",
"letter1=Damp;letter2=Eamp;letter3=F"]
tags = chain.from_iterable(item.split("amp;") for item in tags)
result = [item.split("=")[1] for item in tags]
# ['A', 'B', 'C', 'D', 'E', 'F']
Основываясь на вашем шаблоне, вы действительно не можете получить A B C
, потому C
что у вас его нет =
и amp;
его окружения. Этот код
import re
from itertools import chain
tags = ["letter1=Aamp;letter2=Bamp;letter3=C",
"letter1=Damp;letter2=Eamp;letter3=F"]
pattern = re.compile("=(.*?)amp;")
result = ' '.join(chain.from_iterable([pattern.findall(item) for item in tags]))
дает
A B D E