繁体   English   中英

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

[英]Remove everything after a particular substring using re.sub

我以为这很简单,但是尝试3种不同的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"

谢谢

而不是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
)

使用重新匹配:

>>> 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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM