使用re.sub删除特定子字符串后的所有内容

时间:2017-10-04 00:31:53

标签: python regex string

我认为这很简单,但在尝试了多个不同的re.sub组合3小时之后,答案仍然在逃避。

我有以下字符串:

a = "99999 Anywhere Dr., Roanoak, VA 88888, ,"

我想删除88888和结尾之间的所有内容“(注意除了空格和逗号之外可能还有其他字符,但是在88888之后不会有另外5个数字的字符串。)我尝试了很多组合但我最接近我想要完成的是:

re.sub('(?=>\d{5})(.*)\".*$','',a)

这导致“99999”,因为它不从字符串的末尾看,而是在第一次出现5位数后删除所有内容。我希望结果是:

"99999 Anywhere Dr., Roanoak, VA 88888"

谢谢

2 个答案:

答案 0 :(得分:2)

而不是re.sub,我建议re.search + 重新分配

m = re.search('.*\d{5}', text)
if m:
     text = m.group(0)

print(text)
'99999 Anywhere Dr., Roanoak, VA 88888'
.*        # greedy capture
\d{5}     # 5 digits

如果你想要有创造力,你可以反转你的字符串,然后拨打re.sub,这样你就可以从一开始就看。

text = re.sub('^.*?(?=\d{5})', '', text[::-1])[::-1]
print(text)
'99999 Anywhere Dr., Roanoak, VA 88888'

反转字符串可以让你现在使用前瞻,这简化了事情。

^           # start of line
.*?         # non-greedy capture
(?=         # lookahead 
\d{5}       # 5 digits
)

答案 1 :(得分:0)

使用re.match:

>>> import re
>>> a = "99999 Anywhere Dr., Roanoak, VA 88888, ,"
>>> re.match(r'^.*[\d{5}]?\d{5}', a).group(0)
'99999 Anywhere Dr., Roanoak, VA 88888'

或re.search:

>>> re.search(r'^.*[\d{5}]?\d{5}', a).group(0)
'99999 Anywhere Dr., Roanoak, VA 88888'