Python: извлечь подстроку, если она существует, из другой строки, используя регулярное выражение - PullRequest
0 голосов
/ 05 августа 2020

Я хочу извлечь значение, если оно существует из URL-адреса с помощью регулярного выражения,

Моя строка:

string = "utm_source=google&utm_campaign=replay&utm_medium=display&ctm_account=4&ctm_country=fr&ctm_bu=b2c&ctm_adchannel=im&esl-k=gdn|nd|c427558773026|m|k|pwww.ldpeople.com|t|dm|a100313514420|g9711440090"

Из этой строки я хочу извлечь: c427558773026, значение для извлечения всегда будет начинаться с c и будет иметь этот шаблон | c* |

import re
pattern = re.compile('|c\w|')
pattern.findall(string)

В моем случае результата нет, я использую python 2.7

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Вы можете установить вертикальную черту (не то, чтобы она была экранирована) \| слева и справа, используя поисковые запросы, и сопоставьте c char, за которым следует 1+ цифр \d+

(?<=\|)c\d+(?=\|)

Regex demo

import re
string = "utm_source=google&utm_campaign=replay&utm_medium=display&ctm_account=4&ctm_country=fr&ctm_bu=b2c&ctm_adchannel=im&esl-k=gdn|nd|c427558773026|m|k|pwww.ldpeople.com|t|dm|a100313514420|g9711440090"
print(re.findall(r"(?<=\|)c\d+(?=\|)", string))

Или используйте группу захвата, не обращая внимания на ретроспективу, как @ Wiktor Stribiew , предлагайте:

\|(c\d+)(?=\|)

Демо Regex

0 голосов
/ 05 августа 2020

Проблема с вашим подходом заключается в том, что | - это или , которые должны быть экранированы, чтобы соответствовать литеральному символу. Кроме того, вы можете использовать предварительный просмотр / ретроспективный просмотр, чтобы гарантировать, что | инкапсулирует строку, а не захватывает ее с помощью findall

Вот фрагмент кода, который должен решить проблему:

>>> import re
>>> string = "utm_source=google&...&esl-k=gdn|nd|c427558773026|m|k|..."
>>> pattern = re.compile('(?<=\|)c\d+(?=\|)')
>>> pattern.findall(string)
['c427558773026']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...