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

Python 使用re.sub删除特定子字符串后的所有内容,python,regex,string,Python,Regex,String,我原以为这很简单,但在尝试了3小时多种不同的re.sub组合后,我仍然找不到答案 我有以下字符串: a = "99999 Anywhere Dr., Roanoak, VA 88888, ," 我想删除8888和结尾之间的所有字符”(请注意,除了空格和逗号之外,可能还有其他字符,但8888之后不会有另一个由5位数字组成的字符串)。我尝试了许多组合,但最接近我想要实现的是: re.sub('(?=>\d{5})(.*)\".*$','',a) 这将导致“99999”,因为它不会从字符串的

我原以为这很简单,但在尝试了3小时多种不同的re.sub组合后,我仍然找不到答案

我有以下字符串:

a = "99999 Anywhere Dr., Roanoak, VA 88888, ,"
我想删除8888和结尾之间的所有字符”(请注意,除了空格和逗号之外,可能还有其他字符,但8888之后不会有另一个由5位数字组成的字符串)。我尝试了许多组合,但最接近我想要实现的是:

re.sub('(?=>\d{5})(.*)\".*$','',a)
这将导致“99999”,因为它不会从字符串的末尾查看,而是在第一次出现5位数字后删除所有内容。我希望结果为:

"99999 Anywhere Dr., Roanoak, VA 88888"

谢谢你

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


如果你想变得有创意,你可以颠倒你的字符串,然后调用
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
)
使用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(r'^.*[\d{5}]?\d{5}', a).group(0)
'99999 Anywhere Dr., Roanoak, VA 88888'

你知道
[\d{5}]
在做什么吗?绝对不是你想的。我用这个来“捕捉”“最后出现的5位数字,我想:)好吧,它不这样做。你的模式是有效的,但你对它的理解是错误的。角色类中的任何东西都只是一组角色。贪婪的捕获成功了!谢谢。所以“贪婪”的意思是继续查找字符串,直到找到最后一个正则表达式?如果是这样的话,那么我今天学到了一些东西:)@是的,这就是它的意思。如果有用的话,哈哈!完成。再次感谢!谁会想到字符串反转!为了从一段html中提取正文,我做了如下操作:
r1,r2='^.*','^.*>ydob/@PatrickT如果解析html,我总是建议使用解析器而不是正则表达式,它是一种引人注目的反模式,成功率很低。
>>> 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(r'^.*[\d{5}]?\d{5}', a).group(0)
'99999 Anywhere Dr., Roanoak, VA 88888'