регулярное выражение для удаления дефисов и пробелов

1

У меня есть строка:

<u>40 -04-11</u>

Как удалить пробелы и дефисы, чтобы он возвращал 400411?

В настоящее время у меня есть это:

(<u[^>]*>)(\-\s)(<\/u>)

Но я не могу понять, почему он не работает. Любое понимание было бы оценено.

благодаря

  • 1
    Ты обрекаешь нас на всех!
  • 1
    ах, если бы я пытался разобрать xml или html, я бы использовал парсер html / xml, но это не так! Это просто много мусора в текстовом файле.
Показать ещё 5 комментариев
Теги:

5 ответов

4
Лучший ответ
(<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, с которым я сталкиваюсь. :)

  • 0
    Я думаю, что я могу использовать это для соответствия, но как вы замените?
  • 0
    @itwb Я отредактировал ответ, чтобы включить (по общему признанию грубый) пример Python.
Показать ещё 1 комментарий
3

Вам действительно не нужно регулярное выражение, вы можете использовать:

>>> '<u>40 -04-11</u>'.replace('-','').replace(' ','')
'<u>400411</u>'
  • 0
    Это только одна действительно маленькая часть головоломки. Я, вероятно, получил около 200 <u> беззнаковых значений int, которые искажены. все они в одном документе, мне просто нужно очистить пробелы и дефисы программно. (только между тегами <u> и </ u> тегами)
  • 2
    Используйте анализатор HTML или XML, посетите каждый узел <u> , примените двойную замену wim, затем замените содержимое узла <u> пропатченным текстом.
Показать ещё 1 комментарий
2

Использование синтаксиса 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;
   }
}
1

Вы должны правильно разобраться в своей проблеме. Я, во-первых, не совсем понял это.

Прочитав ваш комментарий (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
1

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

  • Выполнение сопоставления пары <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'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню