我有字符串:
<u>40 -04-11</u>
如何删除空格和连字符,使其返回400411?
目前我有这个:
(<u[^>]*>)(\-\s)(<\/u>)
但我无法弄清楚它为什么不起作用。任何见解都将不胜感激。
由于
答案 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