У меня есть строка:
<u>40 -04-11</u>
Как удалить пробелы и дефисы, чтобы он возвращал 400411?
В настоящее время у меня есть это:
(<u[^>]*>)(\-\s)(<\/u>)
Но я не могу понять, почему он не работает. Любое понимание было бы оценено.
благодаря
(<u[^>]*>)(\-\s)(<\/u>)
Ваш шаблон выше не указывает вашему регулярному выражению, где ожидать числа.
(<u[^>]*>)(?:-|\s|(\d+))*(<\/u>)
Это должно заставить вас начать, но не быть питоном, я не могу дать вам точный синтаксис замены. Просто имейте в виду, что цифры находятся в повторяющейся группе захвата.
Изменение: Это изменение в ответ на ваш комментарий. Как я уже сказал, не парень-питон, но это, вероятно, сделает то, что вам нужно, если вы держите свой язык в порядке.
def repl(matchobj):
if matchobj.group(1) is None:
return ''
else:
return matchobj.group(1)
source = '<u>40 -04-11</u>40 -04-11<u>40 -04-11</u>40 -04-11'
print re.sub(r'(?:\-|\s|(\d+))(?=[^><]*?<\/u>)', repl, source)
Результаты в:
>>>'<u>400411</u>40 -04-11<u>400411</u>40 -04-11'
Если вышеупомянутое оскорбляет божество Python, я обещаю пожертвовать следующим разработчиком PHP, с которым я сталкиваюсь. :)
Вам действительно не нужно регулярное выражение, вы можете использовать:
>>> '<u>40 -04-11</u>'.replace('-','').replace(' ','')
'<u>400411</u>'
<u>
, примените двойную замену wim, затем замените содержимое узла <u>
пропатченным текстом.
Использование синтаксиса Perl:
s{
(<u[^>]*>) (.*?) (</u>)
}{
my ($start, $body, $end) = ($1, $2, $3);
$body =~ s/[-\s]//g;
$start . $body . $end
}xesg;
Или, если Python не имеет эквивалента /e,
my $out = '';
while (
$in =~ m{
\G (.*?)
(?: (<u[^>]*>) (.*?) (</u>) | \z )
}sg
) {
my ($pre, $start, $body, $end) = ($1, $2, $3, $4);
$out .= $pre;
if (defined($start)) {
$body =~ s/[-\s]//g;
$out .= $start . $body . $end;
}
}
Вы должны правильно разобраться в своей проблеме. Я, во-первых, не совсем понял это.
Прочитав ваш комментарий (only between the tags <u> and </u> tags)
, теперь я могу предложить:
import re
ss = '87- 453- kol<u>40 -04-11</u> maa78-55 98 12'
print re.sub('(?<=<u>).+?(?=</u>)',
lambda mat: ''.join(c for c in mat.group() if c not in ' -'),
ss)
результат
87- 453- kol<u>400411</u> maa78-55 98 12
Я, по общему признанию, не очень хорошо разбираюсь в регулярных выражениях, но способ, которым я это сделаю, - это:
<u>...</u>
re.sub
на бит между совпадением с помощью group()
.Это выглядит так:
example_str = "<u> 76-6-76s</u> 34243vvfv"
tmp = re.search("(<u[^>]*>)(.*?)(<\/u>)",example_str).group(2)
clean_str = re.sub("(\D)","",tmp)
>>>'76676'