我认为这很简单,但在尝试了多个不同的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"
谢谢
答案 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'