首页 > 解决方案 > 正则表达式仅查找数字对然后连接值

问题描述

我有一个记录如下的数据集

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

标签: pythonregex

解决方案


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

推荐阅读