python - 正则表达式仅查找数字对然后连接值
问题描述
我有一个记录如下的数据集
Tenochtitlan 1519
Tetzcoco 20
Tlacopan 21
我需要一个正则表达式,它只返回成对存在的数字(即在上面的示例 20 和 21 中) - 最终我可以为数字加上前缀并最终得到:
Tenochtitlan 1519
Tetzcoco 1520
Tlacopan 1521
我已经尝试过了,只是在匹配时遇到了问题(匹配第一条记录中的“15”),然后将匹配作为字符串输出:
list = ["Tenochtitlan 1519","Tetzcoco 20","Tlacopan 21"]
for x in list:
m = re.compile("(\d\D*?){2}")
match_val = m.search(x)
concat = "15" + str(match_val)
re.sub(str(match_val), x, concat)
for x in list:
print(x)
结果 -
Tenochtitlan 1519
Tetzcoco 20
Tlacopan 21
解决方案
首先,str(match_val)
没有做你认为它正在做的事情。从调试器:
(Pdb) str(match_val)
"<re.Match object; span=(13, 15), match='15'>"
其次,x 的值永远不会改变。sub()
只返回新字符串。在 iPython 中演示:
In [1]: import re
In [2]: x = "string"
In [3]: re.sub("ing", "ingthing", x)
Out[3]: 'stringthing'
In [4]: x
Out[4]: 'string'
for... in
您还将在循环中替换原始值时遇到困难。
第三,你的论点sub()
顺序错误。它是:正则表达式,替换字符串,原始字符串。
第四:您的原始正则表达式有点奇怪,可能与您的期望不符。\s\d\d$
或者\s\d{2}$
可能更接近您的预期。
一种方法是使用捕获组(括号)和反向引用(反斜杠和数字)一次性完成替换:
import re
list = ["Tenochtitlan 1519","Tetzcoco 20","Tlacopan 21"]
new_list = []
for x in list:
new_list.append(re.sub('\s(\d\d)$', r' 15\1', x))
for x in new_list:
print(x)
输出:
Tenochtitlan 1519
Tetzcoco 1520
Tlacopan 1521
推荐阅读
- javascript - 用户输入功能无法正常工作?
- if-statement - 错误!条件 MS Word 365 的未知操作码
- angular - igx 网格内联功能不适用于自定义列
- docker - 从 docker-compose.yml 引用 Dockerfile?
- lua - 罗布洛克斯 || game.Players.LocalPlayer.Name 尝试调用字符串值?
- java - Java FileInputStream FileOutputStream 在运行中的区别
- python - 使用 Python 进行简单的对称加密
- java - 使用 Spring Boot 将图像上传到 Google Cloud 存储在本地工作,但在部署时它不起作用
- c - 我可以在调试时准确控制函数返回的内容(即 rand())吗?
- artifactory - 为什么对我的 JFrog 平台管理员隐藏邮件服务器配置?