【问题标题】:Using regex to remove all text after the last number in a string使用正则表达式删除字符串中最后一个数字之后的所有文本
【发布时间】:2016-02-25 20:09:56
【问题描述】:

示例文本

1234 Main St Smallville, KS 92348Small County 

应该让步:

1234 Main St Smallville, KS 92348

示例代码:

return re.match(r'([0-9]+)(?!.*[0-9])', address)

返回:

None

我已经尝试了我能想到的所有可能的模式(例如 /d 而不是 [0-9])并且完全被难住了。正则表达式绝对不是我的强项。有什么建议吗?

【问题讨论】:

  • re.sub(r'\D+$', '', address)(注意:如果没有数字,则返回一个空字符串。)

标签: python regex string


【解决方案1】:

找到字符串中的最后一个数字,然后用re.sub删除它后面的所有字符:

import re
address = "1234 Main St Smallville, KS 92348Small County "
address = re.sub(r'(\d)\D+$', r'\1', address)
print(address) # => 1234 Main St Smallville, KS 92348

见IDEONE demo

正则表达式将一个数字((\d))匹配并捕获到组 1 中,然后匹配一个或多个除数字 (\D+) 之外的字符,直到字符串的末尾 ($)。替换模式仅仅是\1,对我们使用组 1 捕获的数字的反向引用(以在结果字符串中恢复它)。

【讨论】:

  • 好奇lookbehind是否会更有效率,或者更少:re.sub(r'(?<=\d)\D+$', '', address)
  • 鉴于当前的输入类型(短地址字符串),我不认为更好的性能是关键,正则表达式的可读性更优先。如果字符串的长度为 1k+ 个字符,则字符串内的潜在匹配位置开始变得更加重要。如果它接近长字符串的开头,我的建议是最好的。后视解决方案与我的建议几乎相同,因为字符串是从左到右处理的,每个字符都测试它是否是数字。
【解决方案2】:

您可以在\d+ 之前使用贪婪的.* 来确保匹配到最后一位:

>>> print re.findall(r'^(.*\d+).*$', address)[0]
1234 Main St Smallville, KS 92348

Regex Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多