Извлеките символ между специальными символами с помощью регулярного выражения Python

#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