Regex只查找数对,然后连接值

2024-06-26 10:37:34 发布

您现在位置: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

Tags: 数据inre示例formatch记录数字
1条回答
网友
1楼 · 发布于 2024-06-26 10:37:34

首先,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

相关问题 更多 >