正则表达式删除连字符和空格

时间:2011-09-06 04:05:24

标签: python regex

我有字符串:

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

如何删除空格和连字符,使其返回400411?

目前我有这个:

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

但我无法弄清楚它为什么不起作用。任何见解都将不胜感激。

由于

5 个答案:

答案 0 :(得分:5)

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

上面的模式并没有告诉您的正则表达式预期数字在哪里。

(<u[^>]*>)(?:-|\s|(\d+))*(<\/u>)

这应该让你开始,但不是一个python的家伙,我不能给你确切的替换语法。请注意,数字位于重复捕获组中。

编辑:这是针对您的评论的修改。就像我说的,不是一个蟒蛇人,但如果你的舌头恰到好处,这可能会做你需要的。

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开发人员。 :)

答案 1 :(得分:3)

你真的不需要正则表达式,你可以使用:

>>> '<u>40 -04-11</u>'.replace('-','').replace(' ','')
'<u>400411</u>'

答案 2 :(得分: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;
   }
}

答案 3 :(得分: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'

答案 4 :(得分: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